Подскажите, как наиболее красиво рандомизировать вызов функций

Тема в разделе "LANGS.C", создана пользователем dyn, 16 ноя 2009.

  1. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    У проца есть предсказатель переходов. Когда подпрограмма вызывается инструкцией call, то встречая ret процессор _заранее_ знает куда переходить, адрес со стека считывается _только_ для проверки правильности предсказания. После массы push получатся сплошные откаты, процессор будет фактически по 2 ветки кода выполнять.
    Это функция-член класса function, а не команда. Существующие реализации делают вызов через таблицу виртуальных функций, что на одно косвенное обращение к памяти больше, чем у тебя.
    Опыт небогатый, но успешный.
    Запиши это на бумагу и спрячь на пару лет, потом посмеешься ;)
     
  2. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    Ок, переведу. Некто когда-то написал на ассемблере проект и продал заказчику. Прошло время, и автор перестал справляться с поддержкой. Заказчик, устав ждать новый функционал и слушать отговорки, плюнул и отдал это на реинженеринг, заплатив втридорога за переписывание бинаря на С. В результате к тому времени, как автор предоставил исходники, была выпущена следующая версия. Насколько я знаю, проект по сей день успешно развивается другими людьми, на С++. Эти люди хоть и мало понимают в ассемблере, могут эффективно решать поставленные задачи, поэтому поддержка обходится значительно дешевле.
     
  3. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    J0E
    это происходит (насчет знания про рет) только если функции маленькие и новая не выталкивает из стека предыдущую. не забываем, что выполняюся не команды и адреса, а некий достаточно загадочный по организации микрокод. те даже если и поставятся сразу две ветви, то не на выполнение, а на трансляцию.
    опять же, обращаем внимание на то, что стек переходов в обоих случаях (и вашем, и в нашем) формируется прямо перед вызовом. те функции эти предварительно оттранслированы (декодированы) не будут.
    и с каких это пор рет вызывает неоднозначности у предсказателя большие, чем
    mov eax,[ebp+18h]
    mov eax,[eax+34h]
    call dword [eax]
    ?
    осталось только привести декомпиль этой небольшой програмки с исходными строками в комментах, где бы было отчетливо заметно, что мы имеем только одно лишнее обращение к памяти на оператор
    наука учит, что заключения по наблюдениям стоит делать на большом количестве экспериментов, тщательно отмечая условия проведения опыта.
    убеждаемость небольшим количеством успешных или неуспешных опытов - прямая причина суеверий, вер в чудеса, да и религий с поклонениями как таковых.
    охота было спросить будете ли вы носки жевать если не так, но не спрошу. вы человек сдержанный и культурный. таким и оставайтесь. это самая прекрасная ваша черта
    ну так никто ж не спорит, что стоит соотносить задачу с уровнем исполнения (и бюджетом). например, гуе-офисную муть нет нужды писать даже на С или пасе(не вцл). визал бысик для этого самое то. да и школьникам можно вообще ничего не платить. давать им задания в виде лабораторок, а благодарить 5рками.

    с другой стороны когда задача начинает упирается в скорость или размеры - стоит раскошелиться на нормального специалиста, только нормальный специалист дешево не спросит. если зажимать бабосы, то он найдет другое дело, а с вашим начнет "не справляться" и вам придется платить втридорога за перевод
     
  4. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    Так, по поводу бранч предиктора предлагаю не фантазировать, а почитать мануалы.

    Intel:
    AMD:
    С тех пор как призводители камнейозаботились
     
  5. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    С тех пор как производители камней озаботились потреями на вызовы виртуальных функций. Вот что делает BPU
    Но хватит копипастить мануалы, не на те кнопки жму ))
     
  6. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    Именно так и было. Только ошибки в промышленных библиотеках находить пока не удавалось (не считая уже отрапортованных другими), только в компиляторе.
    А зря. Я их, можно сказать, давно проглотил. Потому что ты мне напоминаешь меня самого несколько лет назад )))
    Как раз к уровню и бюджету претензий не было. Там возникла необходимость полностью все переписать, что на асме оказалось несоизмеримо долго.

    ЗЫ Листинги после компиляции function будут позже, сейчас буста нет и меня хватает тока на флуд )
     
  7. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    W4FhLF
    фуу.. много писать..
    конечно конечно. вне всяких сомнений. ваш код пилит дрова, а мой едет на велосипеде за кефиром.
    совершенно верно. если вдруг его потребуется перенести на арм или авр, то придется заменить целых 17 команд! а это практически 30 байт! а если вдруг понадобится его заметно ускорить, то тут и вообще мозг сломать можно! я уж не говорю про внедрение в него многопоточности - за такое только от небанальной фантазии браться можно!
    толи дело визуал басик! оптимизируй и изменяй сколько хочешь! и при этом какие солидные объемы ехешника! а какие требования! сразу видно - люди работали! а как красиво смотрятся команды в исходниках, сколько в них лепнины! стает понятно отчего у их скульптора так нос высо'ко!

    охотно верю. перевести/растолковать можно только то чего сам хорошо понимаешь - это достаточное условие

    по объемам в байтах как исходников с необходимыми библиотеками, так и выходных файлов - я б сказал даже больше. по скорости - меньше (у мсвС++ достаточно хороший оптимизатор чтоб смочь достаточно прилично улучшить даже это). ну а в среднем, да, в 100

    ну да, дописать табличку наподобе map<string, Function> и добавить еще команд 5

    и где вы там полиморфизм усмотрели? и при чем он тут вообще? (закрадывается подозрение, что вы не совсем понимаете, как реализован полиморфизм в С++. не на уровне учебников, а на самом деле)

    ужо второй год слышны от вас молитвы на это. а мессия все нейдет.. неужто существующее сейчас так танцевать мешает? неужто ничего другого более вам подходящего нет?
    когда нет и не находится даже если погуглить пару минут, то одни молятся на пришествие, а другие делают сами чего им надо. впрочем, да, забыл, вы слишком крупная фигура чтобы писать самостоятельно, ведь засмеют когда не сразу получится. а слюной цвиркать и пальчики выгибать - оно приятнее самому

    долго думал почему меня должны смущать функции и где в листинге ниже наблюдается граф.. пока вариантов нет, может послезавтра если время и желание найдутся..

    ну все это можно сделать и сказать проще. но, если цель - впечатлить заказчика с целью промотивировать неотлавливаемые глюки и урвать кэш посолиднее, то вы все говорите и делаете правильно. можно даже и еще умных слов подсыпать для солидности. кашу маслом не испортишь

    ну так ради бога, кто ж вам мешает и в асме дописать пару команд или функу для этих целей обработки результата?

    а до этих "много лет" существовали мфц и вцл, до них овл и жаба, до них тоже были фреймворки, о которых уже и не помню. и каждый раз свеже-только-им-обученая молодежь повторяла на каждом углу эти же слова (надо ж ей на чемто самоутверждаться?). правда, насколько я понял, никто из них не встречался с авторами горшка (слово из поговорки) и не проводил соц опросы среди упомянутых "десятков тысяч людей" на предмет безглючности. без которых подобный треп и есть
    все это кто? - все которые начинали писать на асме? или все у которых не хватило для асма мозгов и они взялись за чтото попроще и пошаблоннее и теперь не теряет случая оплевать то, что когдато не сдюжили чтоб промотивировать свое неумение хотябы для себя?
    или все - это и алкаш из под ближайшего кабака, который тоже когдато пытался, но спился раньше чем нашел-что-искал и теперь уверен сам и свистит всем, что всё окромя бутылки пополнее и поскорее - дурацкие фантазии.
     
  8. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    J0E
    чето вы противорчите себе. то немного, то много. буст - обычный фреймворк, как и многие другие. и счас, и до счас, и после счас. и ошибки в нем есть, хотя может, надо копнуть поглубже или поставить требования понетиповее.
    мфц и вцл - промышленные библиотеки? (что в термине "промышленные библиотеки"?)
    ну так а кто сказал, что с асмом на ты за один заход стаешь? это только кажется, что там все просто. к тому времени, когда асм перестанет казаться глупостями, вы глядя на оператор яву уже будете видеть во что он превратится в декомпиле

    бенч, бенч. не надо копипастить. инженеры чертят схемы, журналисты пишут тексты, а программисты - бенч, бенч - как много в этом звуке

    совершенно не представляю что у вас там за задача и какие требования вы предъявляли до и после.
    коряво спроектировать и ужасно написать можно и на асме, и на С, и на С++. для этого в них вполне достаточно возможностей.
    более того, хитро можно написать и на модуле с адой, в которых сознательно ограничили возможность хитрых ходов.
    панацеи нет.
    обратный вариант тоже присутствует вовсех случаях. правда, яп - не детская книжка, некая подготовка должна быть
     
  9. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    J0E
    W4FhLF
    так, друзья, на все эти ответы-романы начинает уходить слишком много времени. посему не нравится асм - есть куча других прекрасных форумов, где собираются более адекватные с вашей точки зрения люди, где с вами согласятся, горой поддержат и вы хором поплюетесь.

    а без конкретики в виде дизасмов и бенчей сравнивать надстройку над надстройкой с ее основанием я дальше не вижу смысла и возможности. дела знаете ли, дела
     
  10. Folk Acid

    Folk Acid New Member

    Публикаций:
    0
    Регистрация:
    23 авг 2005
    Сообщения:
    432
    Адрес:
    Ukraine
    Если автор темы озаботился тем, как сделать "чтобы авира не палила", то пусть разобъет логику программы на набор "безобидных последовательностей API", приводящих к результату а дальше уже блок схемы, графы и прочая высокоуровневая лабуда, не имеющая никакого отношения к ассемблеру
     
  11. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    Не мешайте скрипторами нам флудить )))
    Не могу ничего сказать про буст, практически не использую.
    Интересно, почему тогда ты просил дизасм?
    Код (Text):
    1. #include <iostream>
    2. #include <boost/function.hpp>
    3.  
    4. void foo() { std::cout << __FUNCSIG__ << '\n'; }
    5. template<typename Fn> void call_fn(Fn& fn) { fn(); }
    6. void test_function() { call_fn(boost::function<void()> (foo)); }
    Код (Text):
    1. ; Function compile flags: /Ogtpy
    2. $T101317 = -12                      ; size = 12
    3. $T101298 = 8                        ; size = 4
    4. _fn$ = 8                        ; size = 4
    5. ??$call_fn@V?$function@$$A6GXXZ@boost@@@@YGXAAV?$function@$$A6GXXZ@boost@@@Z PROC ; call_fn<boost::function<void __stdcall(void)> >, COMDAT
    6.  
    7. ; 13   : template<typename Fn> void call_fn(Fn& fn) { fn(); }
    8.  
    9.     sub esp, 12                 ; 0000000cH
    10.     push    esi
    11.     mov esi, DWORD PTR _fn$[esp+12]
    12.     cmp DWORD PTR [esi], 0
    13.     jne SHORT $LN3@call_fn
    14. ; бросание исключения вырезано
    15. $LN3@call_fn:
    16.     mov edx, DWORD PTR [esi]
    17.     and edx, -2                 ; fffffffeH
    18.     mov eax, DWORD PTR [edx+4]
    19.     add esi, 8
    20.     push    esi
    21.     call    eax
    22.     pop esi
    23.     add esp, 12                 ; 0000000cH
    24.     ret 4
     
  12. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    Хочешь сказать, что производители камней лгут в мануалах? Я проигнорирую предложение погонять это под профайлером сейчас, потому что делал это раньше. Лучше сам посмотри как сбивается предиктор при нарушении Assembly/Compiler Coding Rule 4 ;) если конечно у тебя под рукой есть проц от AMD.
    Ты сильно заблуждаешься, считая, что асм мне не нравится. Отсюда и твои предвзятые ответы. На самом деле я писал еще на ZEUS и GENS3, экономя на именах меток, что бы сорец в память влез, и забил на flat assembler когда Томаш начал ломать обратную совместимость (не надо мне предлагать недоассемблер masm) и я устал слушать вопросы "а что у тебя такое в строке Х?". _Чужой_ асм мало кто может (хочет) читать. Появление х64 было решающим фактором, поскольку писать код для мусорной корзины желания мало. Компиляторы плюсов к этому времени дошли до уровня "лучше, чем invoke", при правильном подходе. (я, если что, поспал уже после поста в хипе :)
     
  13. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    qqwe
    Реализуешь ассоциативный контейнер с лог. временем доступа 5ью командами? Покажешь?

    Как реализован полиморфизм в С++ вообще неважно. Во-первых их там несколько видов. Во-вторых их реализация стандартом не описана и остаётся на усмотрение создателей компилятора. В-третьих если ты про таблицу виртуальных функций для реализации динамического полиморфизма, то я с этим сталкивался ещё много лет назад (даже статью на васм писал: http://wasm.ru/article.php?article=comregexp) в контексте OLE/COM.

    Но дело не в этом. Я про концепцию полиморфизма говорил: "один интерфейс, множество реализаций". Вот у нас один интерфес вызова и множество реализаций функций. Другое дело, что в ЯВУ это на уровне языка, а у тебя велик.

    Я боюсь, что вы не знаете фундаментальных вещей.

    Знаешь, есть такая особенность у людей, которые программируют на ассемблере, они всех остальных почему-то считают глупее себя:)
    Если ты про меня, то можешь поверить я писал на ассемблере достаточно. И GUI писал, и с сетью работал и сис. кодинг. Вот впал в ностальгию, откопал свой проект на ассемблере датируемый началом 2006. Я через это проходил.
    Асм -- самый простой язык, чтобы писать на нём много мозгов как раз не надо. Собственно и задачи, которые ты физически в состоянии на нём решить очень просты. Но при достижении определённого уровня физически не хватит возможностей человеческого организма, чтобы реализовать даже средний, по современным меркам, проект.
    Поэтому, если ты выходишь в "реальный мир" (за пределы WASM.COMMERCE), то, чтобы соответствовать современным требованиям, ты неизбежно будешь вынужден использовать современные средства разработки и чужие наработки в той или иной области. Здесь действует так называемое правило Парето 80/20. Решая задачу, я хочу тратить только 20% на написание кода, остальные время я хочу тратить на решение самой задачи. А на ассемблере получается наоборот, притом, что само время возрастает в разы.

    В общем всего тебе хорошего.
     
  14. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    ЛИСИЦА И ВИНОГРАД
    Голодная кума Лиса залезла в сад;
    В нем винограду кисти рделись.
    У кумушки глаза и зубы разгорелись;
    А кисти сочные, как яхонты горят;
    Лишь то беда, висят они высоко:
    Отколь и как она к ним ни зайдет,
    Хоть видит око,
    Да зуб неймет.
    Пробившись попусту час целой,
    Пошла и говорит с досадою: «Ну, что́ ж!
    На взгляд-то он хорош,
    Да зелен — ягодки нет зрелой:
    Тотчас оскомину набьешь».
    (с) (хотя вообщето эзоп)


    W4FhLF
    если вы про себя, то это не свойство использующих асм и машкод в проганьи, а свойство характера некоторых (не могу подобрать термин. особь - обидит, а индивидуум - не достаточно точно), неважно на чем в данный момент прогающих или не прогающих. этот рефлекс остался еще от обезьян и активно используется лохотронщиками. хотя и проявляется он неравномерно. как и другие рефлексы

    насчет полиморфизма я имел в виду, что полиморфность достигается компиляции в нужный набор разных функций с разными внутренними именами (исходное имя + шифр из типов). впрочем в ваших примерах полиморфизм ни при чем

    средний/крупный/простой - пустые слова из рекламного трепа.
    "а вот возьмем 'обычный' порошок|зубную пасту" ((с) ящик)

    насчет заказа
    нормальное описание требований + бюджет если сдельщина или $10/час почасовка (включая время на выгугливание расшифровок всех употребленных словесных понтов/рисовок). предоплата 50%. кроме того, обращу внимание
    прочем цифра +5 сильно зависит от техзадания/бюджета

    аналогично


    J0E
    вполе нормальный для компилера код. довольно чистый и почти не имеющий скрытого потенциала к глюкам.
    без оглашения предмета/условий эксперимента (например профайлера), сказать тут чтото трудно. на амд я щас
    ничего об этом не знаю. может, потому, что не пользуюсь фасм препроцессором
    а до этого 32, а до этого 16, а до этого 8, а до этого 4, а до этого щёты. просто не надо весь код писать на асме. или на С, или на С++. если не стараться есть только одно и побольше, побольше, то и не приестся, и плохо не станет, и блюэ на это самое не захочется.

    понаблюдайте за свиньями, они сперва бешено жрут, толкая всех вокруг и давясь. если и отвлекаются, то только с полным ртом чего они там жуют. кругом брызгают. а шуму! а когда нажрутся, им стает противно и они ср*т в корыто из которого только что ели. прямо в остатки каши (бывает, что некоторые еще жрут, а другие уже с*ут). эта манера и называется нарицательным "свинья"
     
  15. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    qqwe, да тебе на форум по биологии надо :)
     
  16. fuckinff

    fuckinff New Member

    Публикаций:
    0
    Регистрация:
    21 ноя 2009
    Сообщения:
    32
    весь топик не читал, поэтому возможно уже ответили, но делается легко:

    typedef void (*TFunction)(int arg1, ..);

    TFunction FunctionsArray[10];

    FunctionsArray[0] = (TFunction) YourFunction; // YourFunction должна иметь такой же набор аргументов

    дальше используя rand в случайном порядке вызываешь функции
     
  17. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    Зато определенно можно вернуться к разговору о носках. Существует всего один подходящий профайлер :)