Когда DLL регистрируется, DllRegisterServer
, точка входа метода в Вашем DLL вызывается. Точно так же DllUnregisterServer
вызывается, когда DLL не зарегистрирован.
, Как описано в [1 110] эта статья MSDN:
Дает внутрипроцессорному серверу команду создавать свои ключи реестра для всех классов, поддерживаемых в этом модуле сервера. Если эта функция перестала работать, состояние реестра для всех его классов неопределенно.
Для COM DLL, необходимо будет реализовать собственное DllRegisterServer
и DllUnregisterServer
методы точки входа, которые делают регистрацию/нерегистрацию как соответствующую. Пример кода для DllRegisterServer
может быть найден здесь .
конечный результат регистрации DLL состоит в том, что все CLSIDs для компонентов в DLL регистрируются под HKEY_CLASSES_ROOT\CLSID
. Это позволяет CoCreateInstance
находить корректный сервер при инстанцировании COM-объектов от другого DLL или приложения.
DllUnregisterServer
сделает реверс и удалит все CLSIDs из реестра, которые были помещены там DllRegisterServer
.
более общая информация приблизительно DllRegisterServer
могут быть найдены здесь .
Я думаю, что большинство таких «волшебных оптимизаций» потребуют «анализа эффектов», который выполняется только мифическим «достаточно умным компилятором».
Поразмыслите над этим:
let Expensive x y =
printfn "I am a side-effect of Expensive"
x + y // imagine something expensive
let F x y z =
let tmp = Expensive x y
z + tmp
printfn "Least chance of magic compiler optimization"
for i in 1..3 do
F 3 4 i
printfn "Slightly better chance"
let Part = F 3 4
for i in 1..3 do
Part i
printfn "Now for real"
let F2 x y =
let tmp = Expensive x y
(fun z -> z + tmp)
printfn "Of course this still re-does it"
for i in 1..3 do
F2 3 4 i
printfn "Of course this finally saves re-do-ing Expensive"
let Opt = F2 3 4
for i in 1..3 do
Opt i
(* output
Least chance of magic compiler optimization
I am a side-effect of Expensive
I am a side-effect of Expensive
I am a side-effect of Expensive
Slightly better chance
I am a side-effect of Expensive
I am a side-effect of Expensive
I am a side-effect of Expensive
Now for real
Of course this still re-does it
I am a side-effect of Expensive
I am a side-effect of Expensive
I am a side-effect of Expensive
Of course this finally saves re-do-ing Expensive
I am a side-effect of Expensive
*)
Дело в том, что семантика языка, касающаяся эффектов, требует, чтобы компилятор вел себя точно так же, за исключением «дорогих»
Я не удивлен, что в режиме отладки явно ничего не изменилось. Почему бы вам на самом деле не рассчитать время N повторений ( #time ;;
в интерактивном приглашении F #).
Что касается вашей надежды поделиться общим вычислением для фиксированных значений всех, кроме dx, попробуйте это:
let fdx = foo2 X y1 y2
for dx in dxes do
fdx dx
То есть fdx - частичное приложение. Сохранение его явно вне цикла заставляет меня надеяться на большее от оптимизатора.
По крайней мере, в интерактивном запросе (я не думаю, что там полная оптимизация, не так ли?) Похоже, что мое предложение составляет всего 15% ускорение (странно, что есть какое-то ускорение, потому что он определенно повторяет все тело foo2). Это выполняется намного быстрее:
let fdx = foo3 X y1 y2
for dx in dxes do
fdx dx
Где foo3 (от Бенджлола):
let foo3 (X:float) y1 y2 =
let dy = (y2 - y1) / X
(fun dx -> y1 + dy * dx)
Обратите внимание, что простое использование foo3 в качестве функции с 4 аргументами в цикле в два раза медленнее, чем foo2,
(Это не блуд на репутации, честно говоря, я не подумал об этом, когда начал задавать свой вопрос)
Вот одно решение, которое я придумал, не уверен, что оно лучший:
let foo3 (X:float) y1 y2 =
let dy = (y2 - y1) / X
(fun dx -> y1 + dy * dx)
Работает намного быстрее.