Форум: "Основная";
Текущий архив: 2006.10.01;
Скачать: [xml.tar.bz2];
ВнизInline функции Найти похожие ветки
← →
Kos[UFO] © (2006-08-16 15:17) [0]Умеет ли компилятор BDS создавать встраиваемые функции и насколько это эффективно?
← →
Kos[UFO] © (2006-08-16 15:18) [1]Версия BDS2006
← →
Джо © (2006-08-16 15:24) [2]> [1] Kos[UFO] © (16.08.06 15:18)
> Версия BDS2006
Умеет, с несколькими исключениями.
← →
pasha_golub © (2006-08-16 16:25) [3]
> и насколько это эффективно?
На сегодняшних-то вычислительный мощностях. Не думаю, что стоит.
← →
Anatoly Podgoretsky © (2006-08-16 19:44) [4]Экономия на только на call и ret, то есть практически два такта.
← →
Kos[UFO] © (2006-08-16 20:49) [5]И один такт может улучшить ситуацию, когда это критично. А разве раньше Delphi умел это делать?
Джо, о каких исключениях Вы говорите?
← →
Чапаев © (2006-08-16 20:54) [6]> Экономия на только на call и ret, то есть практически два
> такта.
Это смотря какой список параметров...
← →
Anatoly Podgoretsky © (2006-08-16 21:11) [7]Что же функция такая, которая вызвается миллиарды раз и ничего не делает.
← →
Anatoly Podgoretsky © (2006-08-16 21:12) [8]Чапаев © (16.08.06 20:54) [6]
Причем тут это, вне зависимости от количества параметров, обе эти команды выполняются одинаковое количество тактов.
← →
Джо © (2006-08-16 21:22) [9]> [5] Kos[UFO] © (16.08.06 20:49)
> Джо, о каких исключениях Вы говорите?
The inline directive is a suggestion to the compiler. There is no guarantee the compiler will inline a particular routine, as there are a number of circumstances where inlining cannot be done. The following list shows the conditions under which inlining does or does not occur:
* Inlining will not occur on any form of late-bound method. This includes virtual, dynamic, and message methods.
* Routines containing assembly code will not be inlined.
* Constructors and destructors will not be inlined.
* The main program block, unit initialization, and unit finalization blocks cannot be inlined.
* Routines that are not defined before use cannot be inlined.
* Routines that take open array parameters cannot be inlined.
* Code can be inlined within packages, however, inlining never occurs across package boundaries.
* No inlining will be done between units that are circularly dependent. This included indirect circular dependencies, for example, unit A uses unit B, and unit B uses unit C which in turn uses unit A. In this example, when compiling unit A, no code from unit B or unit C will be inlined in unit A.
* The compiler can inline code when a unit is in a circular dependency, as long as the code to be inlined comes from a unit outside the circular relationship. In the above example, if unit A also used unit D, code from unit D could be inlined in A, since it is not involved in the circular dependency.
* If a routine is defined in the interface section and it accesses symbols defined in the implementation section, that routine cannot be inlined.
* In Delphi.NET, routines in classes cannot be inlined if they access members with less (i.e. more restricted) visibility than the method itself. For example, if a public method accesses private symbols, it cannot be inlined.
* If a routine marked with inline uses external symbols from other units, all of those units must be listed in the uses statement, otherwise the routine cannot be inlined.
Pr* ocedures and functions used in conditional expressions in while-do and repeat-until statements cannot be expanded inline.
* Within a unit, the body for an inline function should be defined before calls to the function are made. Otherwise, the body of the function, which is not known to the compiler when it reaches the call site, cannot be expanded inline.
If you modify the implementation of an inlined routine, you will cause all units that use that function to be recompiled. This is different from traditional rebuild rules, where rebuilds were triggered only by changes in the interface section of a unit.
(c) Delphi Help, "Calling Procedures and Functions" topic.
← →
Чапаев © (2006-08-16 21:22) [10]> Причем тут это
При том, что иногда приходится параметры и через стек передавать.
← →
Джо © (2006-08-16 21:24) [11]> [8] Anatoly Podgoretsky © (16.08.06 21:12)
> Чапаев © (16.08.06 20:54) [6]
> Причем тут это, вне зависимости от количества параметров,
> обе эти команды выполняются одинаковое количество тактов.
Push забывать не стоит.
← →
jack128 © (2006-08-16 21:26) [12]Чапаев © (16.08.06 21:22) [10]
При том, что иногда приходится параметры и через стек передавать.
они и в случае inline функций через стек передаются.
← →
Чапаев © (2006-08-16 21:29) [13]> они и в случае inline функций через стек передаются
Да? Каюсь, не исследовал код. Но имхо копию параметров в стек делать нет смысла в случае инлайнов...
← →
Джо © (2006-08-16 21:33) [14]> [12] jack128 © (16.08.06 21:26)
> они и в случае inline функций через стек передаются.
Нет, только что проверил, не передаются. Вот, обычная "болванка", чтобы не через регистры:procedure A (I: Integer; B: Integer; H: Integer; D: Double; F: Double); inline;
begin
ShowMessage (IntToStr(I));
end;
Параметры в стек не запихиваются.
← →
Чапаев © (2006-08-16 21:46) [15]> Параметры в стек не запихиваются.
Флоаты таки дополнительно запихиваются в стек, просто в твоём примере компилятор мудро догадался, что последние четыре параметра ни к чему.
← →
Джо © (2006-08-16 21:56) [16]> [15] Чапаев © (16.08.06 21:46)
Снова проверяем:procedure Proc (A,B,C,D,E,F,G,H: Int64); inline;
begin
ShowMessageFmt ("%d,%d,%d,%d,%d,%d,%d,%d",[A,B,C,D,E,F,G,H]);
end;
Не запихиваются :)
← →
Чапаев © (2006-08-16 22:00) [17]
Unit1.pas.35: A(1,2,3,4.5,6.7);
00457DF8 8D55FC lea edx,[ebp-$04]
00457DFB B801000000 mov eax,$00000001
00457E00 E8D707FBFF call IntToStr
00457E05 8B45FC mov eax,[ebp-$04]
00457E08 E82745FDFF call ShowMessage
00457E0D 8D55F8 lea edx,[ebp-$08]
00457E10 B802000000 mov eax,$00000002
00457E15 E8C207FBFF call IntToStr
00457E1A 8B45F8 mov eax,[ebp-$08]
00457E1D E81245FDFF call ShowMessage
00457E22 8D55F4 lea edx,[ebp-$0c]
00457E25 B803000000 mov eax,$00000003
00457E2A E8AD07FBFF call IntToStr
00457E2F 8B45F4 mov eax,[ebp-$0c]
00457E32 E8FD44FDFF call ShowMessage
00457E37 6801400000 push $00004001
00457E3C 6800000090 push $90000000
00457E41 6A00 push $00
00457E43 8D45F0 lea eax,[ebp-$10]
00457E46 E8411CFBFF call FloatToStr
00457E4B 8B45F0 mov eax,[ebp-$10]
00457E4E E8E144FDFF call ShowMessage
00457E53 6801400000 push $00004001
00457E58 68666666D6 push $d6666666
00457E5D 6866666666 push $66666666 //тут был Сотона!
00457E62 8D45EC lea eax,[ebp-$14]
00457E65 E8221CFBFF call FloatToStr
00457E6A 8B45EC mov eax,[ebp-$14]
00457E6D E8C244FDFF call ShowMessage
← →
Джо © (2006-08-16 22:02) [18]> [17] Чапаев © (16.08.06 22:00)
Теперь сравни без inline:Unit24.pas.33: Proc (10,20,30,40,50,60,70,80);
00457FE0 6A00 push $00
00457FE2 6A0A push $0a
00457FE4 6A00 push $00
00457FE6 6A14 push $14
00457FE8 6A00 push $00
00457FEA 6A1E push $1e
00457FEC 6A00 push $00
00457FEE 6A28 push $28
00457FF0 6A00 push $00
00457FF2 6A32 push $32
00457FF4 6A00 push $00
00457FF6 6A3C push $3c
00457FF8 6A00 push $00
00457FFA 6A46 push $46
00457FFC 6A00 push $00
00457FFE 6A50 push $50
00458000 E84BFFFFFF call Proc
← →
Чапаев © (2006-08-16 22:12) [19]Без инлайна работа со стеком значительно интенсивнее. Но всё же и говорить, что при использовании инлайна в стек ничего не кладётся, не приходится...
← →
Джо © (2006-08-16 22:15) [20]> [19] Чапаев © (16.08.06 22:12)
> Без инлайна работа со стеком значительно интенсивнее. Но
> всё же и говорить, что при использовании инлайна в стек
> ничего не кладётся, не приходится...
А я и не говорил. Я говорил только ([11]): "Push забывать не стоит". :-p
← →
Джо © (2006-08-16 22:17) [21]> Чапаев
И в твоем листинге push"и идут уже внутри функции, т.е, при вызове FloatToStr, которая не объявлена как inline. Соответственно, никакого отношения к сабжу не имеет.
← →
Джо © (2006-08-16 22:18) [22]Мой вывод таков. Inline полезно для функций с большим количеством параметров, особенно для функций, вызываемых многократно в цикле. Банально, но так :)
← →
Чапаев © (2006-08-16 22:21) [23]> [21] Джо © (16.08.06 22:17)
Стыдно. :`-(
← →
Kos[UFO] © (2006-08-16 22:40) [24]2Джо:
Вау! Даже вывод) Спасибо.
Всем спасибо.
← →
jack128 © (2006-08-16 22:43) [25]Джо © (16.08.06 22:02) [18]
Хм. Да, я не прав. Туже ошибку, что и Чапаев допустил.
← →
Германн © (2006-08-17 00:13) [26]Что деется! Гегемоны приспособили директиву inline на свой манер! Вот уж не ожидал! И как давно сие случилось?
← →
Германн © (2006-08-17 00:19) [27]Может быть и директива assembler теперь имеет другой смысл?
Да и ещё. Что за Хелп по BDS2006? Чем его читать, если сам BDS2006 в системе не установлен?
← →
Чапаев © (2006-08-17 00:45) [28]> Может быть и директива assembler теперь имеет другой смысл?
Теперь (начиная со второй версии Делфи) она не имеет никакого смысла...
← →
Германн © (2006-08-17 00:48) [29]
> Теперь (начиная со второй версии Делфи) она не имеет никакого
> смысла...
>
Это уже давно не "теперь" :-)
Но главный вопрос-то остался неотвечен! Когда директива inline поменяла свой старый смысл?
← →
Джо © (2006-08-17 01:08) [30]> [29] Германн © (17.08.06 00:48)
> Но главный вопрос-то остался неотвечен! Когда директива
> inline поменяла свой старый смысл?
В BDS2006.
← →
Германн © (2006-08-17 01:17) [31]
> Джо © (17.08.06 01:08) [30]
Спасибо Серёга.
← →
Ketmar © (2006-08-17 01:21) [32]> [27] Германн © (17.08.06 00:19)
директива "assembler" дано не имеет никакого смысла. см. справку.
← →
Германн © (2006-08-17 01:23) [33]
> Да и ещё. Что за Хелп по BDS2006? Чем его читать, если сам
> BDS2006 в системе не установлен?
>
И это меня тоже интересует!
← →
Ketmar © (2006-08-17 01:26) [34]> [33] Германн © (17.08.06 01:23)
насколько я помню -- обыкновенный chm.
← →
Германн © (2006-08-17 01:31) [35]
> Ketmar © (17.08.06 01:21) [32]
>
> > [27] Германн © (17.08.06 00:19)
> директива "assembler" дано не имеет никакого смысла. см.
> справку.
>
Сподвигло меня на сей вопрос ответ из ветки про HexToStr - Шпиён (16.08.06 00:43) [30]
> Германн © (16.08.06 00:24) [29]
хочешь?
Ассемблерный вариант в D6 закомментирован -)
← →
Джо © (2006-08-17 01:53) [36]> [34] Ketmar © (17.08.06 01:26)
> > [33] Германн © (17.08.06 01:23)
> насколько я помню -- обыкновенный chm.
Нет, это так называемый Microsoft Document Explorer. Не знаю, распространяется ли отдельно. Во всяком случае, это та же программа, которая используется для просмотра локальной копии MSDN.
← →
Германн © (2006-08-17 02:07) [37]У меня на компе куча файлов с расширениеми Hxl и HxS. И как их "готовить" - не имею ни малейшего понятия. :-(
← →
Ketmar © (2006-08-17 02:25) [38]> [36] Джо © (17.08.06 01:53)
значит, ошибся. %-)
← →
Джо © (2006-08-17 02:37) [39]Вот тут нашел статейку
http://wiki.services.openoffice.org/wiki/Integrate_Custom_Help_Into_MSDEV
может, кому-то будет полезна.
Сорри за оффтоп.
← →
Джо © (2006-08-17 02:47) [40]Уж раз такая тема затронулась, то вот чего я накопал. Если уже установлен MSDN или MSVS2005, то в оный хелп можно включить и Борландовские хелп-коллекции (если они установлены). Запускаем:
"C:\Program Files\Common Files\Microsoft Shared\Help\dexplore.exe" /helpcol ms-help://MS.VSCC.v80/dv_vscccommon/local/CollectionManager.htm
или"C:\Program Files\Common Files\Microsoft Shared\Help\dexplore.exe" /helpcol ms-help://MS.VSCC.2003/VSCCCommon/cm/CollectionManager.htm
для VS.NET 2003
минутку ждем и на открывшейся странице идем по ссылке Visual Studio 2005 Combined Help Collection Manager. После этого отмечаем галочкой те коллекции, которые нужно включить и жмем Update VSCC.
Я себе так настроил Борландовский хелп, который теперь отображается внутри оболочки MSDE для MSDN.
Страницы: 1 2 вся ветка
Форум: "Основная";
Текущий архив: 2006.10.01;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.015 c