Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Эксперементы с DLL (тем кто интересовался) / 6 сообщений из 6, страница 1 из 1
25.12.2006, 14:47
    #34222754
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эксперементы с DLL (тем кто интересовался)
Привет всем!

Недавно были вопросы типа "Не вредно ли часто вызывать 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.
do while .t.
	DECLARE integer fnTestDll in TestDLL.DLL
enddo
не приводит к увеличению объема памяти VFP
2. Реальная проверка существования DLL и нужной функции в ней происходит при первой попытке вызова этой функции
3. Как правило используются функции ядра Win (KERNEL32.DLL) их даже убирать не надо, т.к. KERNEL32.DLL используется самим фоксом и все равно остается загруженной после CLEAR DLL
4. Реально CLEAR DLL для одной функции невозможно - она может уйти из списка описаний, а DLL подцепляется целиком, а не по одной функции.
...
Рейтинг: 0 / 0
25.12.2006, 14:58
    #34222787
piva
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эксперементы с DLL (тем кто интересовался)
У любой DLL'ки которая загрущается по LoadLibrary есть счечик usage который показывает сколько раз она была загружена процессами, после обнуления этого счетчика она физичиски выгружается из памяти
...
Рейтинг: 0 / 0
25.12.2006, 15:00
    #34222800
Aleksey-K
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эксперементы с DLL (тем кто интересовался)
Вопрос это поднимал и я в том числе, но уже давно (с подсказки ВладимирМ) выяснил, что DECLARE DLL одной и той же функции можно делать сколько угодно раз (во всяком случае, для VFP 9.0). Для проверки справедливости этого факта достаточно использовать функцию ADLLS.

С уважением, Алексей
...
Рейтинг: 0 / 0
25.12.2006, 15:34
    #34222970
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эксперементы с DLL (тем кто интересовался)
pivaУ любой DLL'ки которая загрущается по LoadLibrary есть счечик usage который показывает сколько раз она была загружена процессами, после обнуления этого счетчика она физичиски выгружается из памяти
Это касается загрузки DLL в win (как операционку) Код DLL в память загружается единожды. Счетчик считает количество процессов спроецировавших код DLL в свое адресное пространство.
В адресное пространство процесса DLL проецируется единожды по вызову LoadLibrary(), повторные вызовы возвращают указатель на уже спроецированный модуль.
После любого количества вызовов LoadLibrary(), один вызов FreeLibrary() убирает проекцию из адресного пространства процесса.
...
Рейтинг: 0 / 0
26.12.2006, 19:29
    #34226160
oleg_km
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эксперементы с DLL (тем кто интересовался)
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

У меня была ощутимая разница (в разы)
может в новых версиях изменилось
...
Рейтинг: 0 / 0
27.12.2006, 07:56
    #34226662
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эксперементы с DLL (тем кто интересовался)
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 и жрал столько же.
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Эксперементы с DLL (тем кто интересовался) / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]