Парочка вопросов про функции

Тема в разделе "LANGS.C", создана пользователем ajak, 8 ноя 2008.

  1. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    нарисовал не совсем корректный тест, но всё-же представления о разницах даёт.
    только у него какой-то зюк - работает в отладчике нормально, а без падает.
    и масм почему-то добавил мне в код мусора - вообще (.)
    Код (Text):
    1. .686
    2. .model flat, stdcall
    3. option casemap:none
    4.  
    5. include windows.inc
    6. include kernel32.inc
    7. include user32.inc
    8. includelib kernel32.lib
    9. includelib user32.lib
    10.  
    11. .data
    12. formstr         db  "%i", 0
    13. lpOut           db  16 dup(0)
    14. lpOut2          db  16 dup(0)
    15. sCicl           db  "for cicle", 0
    16. sFlat           db  "for flat", 0
    17.  
    18.  
    19. .data?
    20.  
    21. starttest       dd  ?
    22. timecicle       dd  ?
    23.  
    24.    
    25. .code
    26.  
    27. start:
    28.         rdtsc
    29.         mov starttest, dword ptr eax
    30.         mov ecx, 10000h
    31. testloop1:
    32.         xor eax, eax
    33.         loop    testloop1
    34.         rdtsc
    35.         sub eax, starttest
    36.         mov timecicle, eax
    37.         invoke  wsprintfA, offset lpOut, offset formstr, eax
    38.         invoke  MessageBox, 0, offset lpOut, offset sCicl, MB_OK
    39. test2:
    40.         rdtsc
    41.         mov starttest, dword ptr eax
    42.         dw   10000h dup(33c0h)
    43.         rdtsc
    44.         sub eax, starttest
    45.         invoke  wsprintfA, offset lpOut2, offset formstr, eax
    46.         invoke  MessageBox, 0, offset lpOut2, offset sFlat, MB_OK
    47.         invoke ExitProcess, 0
    48.    
    49.        
    50. end start
    http://ifolder.ru/8975617 это бинарик с мусором, как такое стало возможно?
     
  2. only

    only New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2008
    Сообщения:
    147
    Про С компилятор понятно.
    А Вы уверены, что транслятор в машинный код это учитывает?
    Думаю разницы нет.
    wsd
    dw 10000h dup(33c0h)
    Это такая программа?
    Нужно бы нормального алгоритма примерчик )
     
  3. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    0040104B C033 C0 SAL BYTE PTR DS:[EBX],0C0 ; Shift out of range
    это потому что ты не учёл что младший байт сначала :)
    правильно dw 10000h dup(0c033h)
    Тест действительно некорректный хотя и наглядный - на малых повторах цикл значительно медленнне ибо там две команды xor + loop (которая быстрее выполняется если разбить её на части :), но на 10000h время становится приблизительно равным значит есть замедление из-за кеширования, но реальный код не состоит из бессмысленных xor, а потому реальные команды дают большую фору на предварительное кеширование и формирование очереди в соотвествии с предсказанием переходов. Так что не всё однозначно, но в целом согласен - злоупотреблять инлайнами также не правильно как и их недооценивать.
    only
    dw 100000h dup(0c033h)
    это xor eax, eax развёрнутый в линейный код вместо цикла.
     
  4. only

    only New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2008
    Сообщения:
    147
    Это понятно

    Проверить какую-нибудь крипто хеш-функцию бы например
     
  5. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Y_Mur
    У меня пример wsd с циклом примерно в два раза быстрее. Но дело конечно в том, что бессмысленно инлайнить код, когда выйгрыш от этого мизерный. Просто увеличиваем размер программы, а толку никакого. Вот по-этому "умный" инлайн и кстати.
     
  6. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    бессмысленный спор. напишите прогу с длинными инлайнами (или вызовом через строчку. ессно функа int foo(){return 0;} сообразится однозначно вне зависимости от инлайнов) и короткими не инлайнами или средними инлайнами и неинлайнами. скомпильте с разными оптимизациями на нормальном компиле. полюбуйтесь на прибор ложимый компилем на ваши инлайны иже и их отсутствие. имхо единственный боле-мене способ чтоб компиль не заинлайнил или не проилиминировал функу если сочтет нужным - ехтерн на ней.
     
  7. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    _basmp_
    А опции компиля на что?
     
  8. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    Booster
    если не использовать оптимизаци, то и инлайны не заинлайнятся. или я не понял чего?
     
  9. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    Инлайнить функции по 100кб такой же бред, как измерять производительность цикла с 1 машинной командой. Тест высосан из пальца и слишком далёк от реальности.

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

    Причём ситуация примерно следующая(так я себе представляю). Если функция маленькая(3-4 строки, что в среднем составляет 10-20 машинных команд), то в таком случае время потраченной на её вызов будет всего-лишь в несколько раз меньше времени исполнения самой функции. Поэтому её вроде как имеет смысл заинлайнить. Но в то же время прирост от инлайна будет заметене при очень частом вызове функции(миллиарды раз). Время выполнения средних функций по отношению к вызову составляет 1-2%(из моих собственных наблюдений), поэтому тут и экономия мизерная. Большие функции не рассматриваем, их инлайнить бессмысленно.
    Но смысл в том, что инлайн не только позволяет сэкономить на вызове и сбросах конвеера на вызове(и что там ещё на аппаратном уровне происходит, знатоки поправьте), а в то же время существует масса ситуаций, когда инлайн снижает кол-во обращений к памяти или позволяет сэкономить время на копировании объекта(в C++).

    А макросы я не люблю, ибо они усложняют код и его восприятие и их сложно отлаживать.
     
  10. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    W4FhLF
    да с кодом ксора от усталости попутал.
    там в тесте ещё косячок с рдтск, не учитывается EDX, может выстрелить.
    тест действительно не прецизионный :dntknw:
    но можеш в dup(33c0h) загнать более осмысленный код и увеличить
    множитель дупа.
    а ты как предлагаеш померять?