Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
8-1141700996
Максиммм
2006-03-07 06:09
2006.10.01
Скрыть курсор


2-1158145423
Gorin
2006-09-13 15:03
2006.10.01
Как сохранить изменения, сделанные SQL запросом.


1-1155891370
vic_774N
2006-08-18 12:56
2006.10.01
компонент эмуляции терминала VT400


2-1157713959
newbie2
2006-09-08 15:12
2006.10.01
Как посмотреть интерфейс функций из dll?


8-1142330520
dracula
2006-03-14 13:02
2006.10.01
ISO 9660 информация о сессиях и трэках?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский