F#: Частичное приложение и предварительное вычисление

Когда 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 могут быть найдены здесь .

5
задан Benjol 16 September 2009 в 07:15
поделиться

3 ответа

Я думаю, что большинство таких «волшебных оптимизаций» потребуют «анализа эффектов», который выполняется только мифическим «достаточно умным компилятором».

Поразмыслите над этим:

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

*)    

Дело в том, что семантика языка, касающаяся эффектов, требует, чтобы компилятор вел себя точно так же, за исключением «дорогих»

4
ответ дан 14 December 2019 в 04:43
поделиться

Я не удивлен, что в режиме отладки явно ничего не изменилось. Почему бы вам на самом деле не рассчитать время 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,

1
ответ дан 14 December 2019 в 04:43
поделиться

(Это не блуд на репутации, честно говоря, я не подумал об этом, когда начал задавать свой вопрос)

Вот одно решение, которое я придумал, не уверен, что оно лучший:

let foo3 (X:float) y1 y2 =
    let dy = (y2 - y1) / X
    (fun dx -> y1 + dy * dx)

Работает намного быстрее.

3
ответ дан 14 December 2019 в 04:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: