Ламерский вопрос про inline

Тема в разделе "WASM.A&O", создана пользователем persicum, 15 янв 2010.

  1. persicum

    persicum New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2007
    Сообщения:
    947
    Есть функция на двеннадцать коммандочек. Много ли она потеряет, если вместо макроподстановки вызывать ее фастколлом?
     
  2. Phuntik

    Phuntik New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2008
    Сообщения:
    318
    Ну, раздел ты удачно подобрал.
    Потеряет в чём?
     
  3. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    persicum
    от 0 до 3 mov'ов + call + ret ?
    не?
     
  4. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    это потери при каждом вызове.
     
  5. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    Fastcall это не inline. Fastcall вызывает функцию через call, inline - напрямую встраивает в код. Так что от inline экономия будет как минимум на одной паре call-ret.
     
  6. persicum

    persicum New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2007
    Сообщения:
    947
    Уточню вопрос. Насколько потеряет в быстродействии функция длиной скажем в шестнадцать асмовых комманд, если ее вызывать call и возвращаться ret, передавая параметры через регистры, по отношению к быстродействию той же функции, чье тело прописывается в коде каждый раз макросом?
     
  7. persicum

    persicum New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2007
    Сообщения:
    947
    Вот еще, для макроподстановки функции тоже нужно готовить входные параметры =(((
    ну тоесть наскока call и ret так сказать травмируют вычислительный прцесс, может для 16-ти асмовых комманд уже можно будет принебреч ?
     
  8. Phuntik

    Phuntik New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2008
    Сообщения:
    318
    Дело не в процентном соотношении (исполняемый код процедуры)/(сall+ret+загрузка данных).
    Дело в том, как часто вызывается процедура. Если один раз за всё время - никакой разницы.
    А если в основном цикле, то разница вполне может быть заметна.
     
  9. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    Так просто на это вопрос не ответить. С одной стороны, будут потери на call+ret. С другой - если функция заинлайнена 100000 раз, это раздует код, он перестанет помещаться в кеш, будут промахи которые еще дороже. Поэтому бери профайлер и меряй реальный код.
     
  10. persicum

    persicum New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2007
    Сообщения:
    947
    Да, с этим я тоже сталкивался, например когда развернул RSA 4096 и он у меня перестал а кэш влезать, и без того тормоз стал тормозить еще сильнее.

    Проблема в том, что специфика моего маньячества требует обязательную пропись мелких функций на асме (в языках отсутствуют специфические типы данных вроде конЕчных полей , элл. кривых и т.д.). А компилеры что я пробовал не позволяют вроде инлайн функций с дерективой asm. Ну буду делать макроподстановку.
     
  11. PSR1257

    PSR1257 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2008
    Сообщения:
    933
    persicum

    Присоединяюсь к J0E - померять разные варианты и выбрать лучший.

    А (имхо) лучше развлекаццо в DLL, на asm. Может получиться удачная библа.
    CALL+RET скорее лучше не делать. Алгоритм можно выложить и думаю тут найдутся люди кто скажет как можно улучшить, ну там может mmx.
     
  12. J0E

    J0E New Member

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

    А что за функции? Вдруг их можно все таки написать на С?
     
  13. persicum

    persicum New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2007
    Сообщения:
    947
    Да там фигня всякая вроде

    add eax,ecx
    adc eax,0
    sub eax,edx
    sbb edx,edx

    и так далее... На си себе дороже обойдется.
     
  14. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    Да уж С с carry flag плохо дружит, cмотрим 2–12 Overflow Detection http://www.hackersdelight.org/basics.pdf
    Код (Text):
    1. uint32_t fignya(uint64_t eax, uint32_t ecx, uint32_t edx)
    2. {
    3.   eax += ecx;
    4.   eax += eax >> 32;
    5.   return (uint32_t)eax < edx ? -1 : 0;
    6. }
    Получается одна лишняя команда против call+ret
    Код (Text):
    1.     mov ecx, DWORD PTR _eax$[esp-4]
    2.     add ecx, DWORD PTR _ecx$[esp-4]
    3.     mov eax, DWORD PTR _eax$[esp]
    4.     adc eax, 0
    5.     add eax, ecx
    6.     cmp eax, DWORD PTR _edx$[esp-4]
    7.     sbb eax, eax
    при инлайне может лучше будет.