
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
25.12.2006, 14:47
|
|||
|---|---|---|---|
Эксперементы с DLL (тем кто интересовался) |
|||
|
#18+
Привет всем! Недавно были вопросы типа "Не вредно ли часто вызывать DECLARE DLL?" На днях разбирался с ньюансами использования WinAPI. Точнее с работой DLL в win. Итого следующее: на уровне WinAPI вызов функции DLL из фокса происходит так: LoadLibrary() - загрузка DLL в адресное пространство процесса Func = GetProcAddress("имя функции") - получение точки входа в функцию Func() - вызов функции FreeLibrary() - выгрузка DLL из адресного пространства процесса (по выходу или CLEAR DLL) Результаты экспериментов VFP6SP5: 1. DECLARE DLL - фокс сохраняет описание функции где-то у себя в памяти 2. при первом вызове функции происходит загрузка DLL (LoadLibrary), если DLL уже загружена, то повторно ее загрузить не дает Windows (LoadLibrary возвращает указатель на уже загруженный экземпляр) 3. CLEAR DLL - очищает список описаний, выгружает загруженные пользовательские DLL Выводы: 1. DECLARE DLL для одной функции можно делать сколько угодно раз, маловероятно что разработчики фокса сделали тупое добавление без проверки что описание этой функции уже есть. Код Код: plaintext 1. 2. 2. Реальная проверка существования DLL и нужной функции в ней происходит при первой попытке вызова этой функции 3. Как правило используются функции ядра Win (KERNEL32.DLL) их даже убирать не надо, т.к. KERNEL32.DLL используется самим фоксом и все равно остается загруженной после CLEAR DLL 4. Реально CLEAR DLL для одной функции невозможно - она может уйти из списка описаний, а DLL подцепляется целиком, а не по одной функции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.12.2006, 14:58
|
|||
|---|---|---|---|
Эксперементы с DLL (тем кто интересовался) |
|||
|
#18+
У любой DLL'ки которая загрущается по LoadLibrary есть счечик usage который показывает сколько раз она была загружена процессами, после обнуления этого счетчика она физичиски выгружается из памяти ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.12.2006, 15:00
|
|||
|---|---|---|---|
Эксперементы с DLL (тем кто интересовался) |
|||
|
#18+
Вопрос это поднимал и я в том числе, но уже давно (с подсказки ВладимирМ) выяснил, что DECLARE DLL одной и той же функции можно делать сколько угодно раз (во всяком случае, для VFP 9.0). Для проверки справедливости этого факта достаточно использовать функцию ADLLS. С уважением, Алексей ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.12.2006, 15:34
|
|||
|---|---|---|---|
Эксперементы с DLL (тем кто интересовался) |
|||
|
#18+
pivaУ любой DLL'ки которая загрущается по LoadLibrary есть счечик usage который показывает сколько раз она была загружена процессами, после обнуления этого счетчика она физичиски выгружается из памяти Это касается загрузки DLL в win (как операционку) Код DLL в память загружается единожды. Счетчик считает количество процессов спроецировавших код DLL в свое адресное пространство. В адресное пространство процесса DLL проецируется единожды по вызову LoadLibrary(), повторные вызовы возвращают указатель на уже спроецированный модуль. После любого количества вызовов LoadLibrary(), один вызов FreeLibrary() убирает проекцию из адресного пространства процесса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
26.12.2006, 19:29
|
|||
|---|---|---|---|
|
|||
Эксперементы с DLL (тем кто интересовался) |
|||
|
#18+
DECLARE integer fnTestDll in TestDLL.DLL Единственно, я обнаружил (в VFP 6 SP5), что вызов DECLARE занимает очень много времени, больше чем сам вызов функции. Попробуйте в профилере: for i = 1 to 10000 DECLARE integer fnTestDll in TestDLL.DLL fnTestDll() endfor и DECLARE integer fnTestDll in TestDLL.DLL for i = 1 to 10000 fnTestDll() endfor У меня была ощутимая разница (в разы) может в новых версиях изменилось ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
27.12.2006, 07:56
|
|||
|---|---|---|---|
Эксперементы с DLL (тем кто интересовался) |
|||
|
#18+
oleg_kmDECLARE integer fnTestDll in TestDLL.DLL Единственно, я обнаружил (в VFP 6 SP5), что вызов DECLARE занимает очень много времени, больше чем сам вызов функции. Попробуйте в профилере: for i = 1 to 10000 DECLARE integer fnTestDll in TestDLL.DLL fnTestDll() endfor и DECLARE integer fnTestDll in TestDLL.DLL for i = 1 to 10000 fnTestDll() endfor У меня была ощутимая разница (в разы) может в новых версиях изменилось Действительно медленно. Но в VFP9.1 еще медленней (в 3 раза). Похоже MS решила хоронить фокс другим способом: надобавлять столько чтобы работал фокс со скоростью .NET и жрал столько же. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=41&tablet=1&tid=1590093]: |
0ms |
get settings: |
6ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
37ms |
get topic data: |
6ms |
get forum data: |
3ms |
get page messages: |
24ms |
get tp. blocked users: |
1ms |
| others: | 230ms |
| total: | 320ms |

| 0 / 0 |
