楓之谷洋蔥很肥的迷思
楓之谷洋蔥很肥的迷思
之前寫的楓之谷洋蔥因為耗用太多記憶體結果害我沒有繼續維護,
最近就打算重寫...重寫到一半才發現是佔用我20倍的記憶體量...囧,
新版的楓之谷洋蔥目前只需要不到 5,000 K 的記憶體量,
但調用了DLL會暴增到將近 80,000 K ...
然後我也不知道該說啥了~這麼久沒更新了這樣...都不知道該Po啥...XD
我後來只好Google一些減少記憶體用量的方法...SetProcessWorkingSetSize
結果繼續Google才知道...
http://hi.baidu.com/taobaoshoping/blog/item/a1f6baf52d523a21bd3109f5.html
http://blog.sina.com.cn/s/blog_49f8960e0100081x.html
後來我只好用了另類方法針對這點做優化,因為沒辦法Freelibrary,會造成錯誤...
但還是莫名的多了3倍...就算把Module砍掉也沒用~
所以目前還是需要大概 20,000 K 左右~"~
而且我還沒加入Webbrowser...加了一定會再爆增QQ
對了!還有個問題,不知道為啥調用那DLL後,我的程式關閉會沒辦法順利釋放記憶體(沒關完全)有人知道是為什麼嗎?...只好調用Taskkill來關...
有沒有人提供一些有關優化程序效能的網站阿~
一些比較好的寫法,演算法、習慣之類的...
之前寫的楓之谷洋蔥因為耗用太多記憶體結果害我沒有繼續維護,
最近就打算重寫...重寫到一半才發現是佔用我20倍的記憶體量...囧,
新版的楓之谷洋蔥目前只需要不到 5,000 K 的記憶體量,
但調用了DLL會暴增到將近 80,000 K ...
然後我也不知道該說啥了~這麼久沒更新了這樣...都不知道該Po啥...XD
我後來只好Google一些減少記憶體用量的方法...SetProcessWorkingSetSize
結果繼續Google才知道...
工作管理員中的記憶體用量,較精確的名稱是 working set size,working set 是 Windows Virtual Memory Manager (以下簡稱 VMM) 替這個 process 所 allocate 的 physical memory。(所以看書只看到這裡的人,就會振振有詞地說你的程式很肥要怎樣怎樣 …) Working set 又可分成兩部份,一部份是 private working set,另一部份則是 shared working set,顧名思義 private 就是只供此 process 所使用,而 shared 則是由所有 process 共用。(題外話:因此 .Net 或 Java 程式光看 working set size 一定很肥,因為它們有一大塊 shared working set) 所以要看一個程式的記憶體用量,應該要看它的 private working set,這可以用 Process Explorer 來觀察。但是,就算是 Private working set 這個數字,也是會騙人的。你可以用SetProcessWorkingSetSize,把 minimum 和 maximum size 都設成 -1,如此一來 Windows VMM 會將所有 pagable 的 page 全部扔回硬碟去,自然記憶體用量就會變很小。常見的迷思是「記憶體用量小 = 程式快 = 效率高」,這不一定是對的,跑的快的程式要努力減少 page fault,而不是一味追求記憶體用量小。基本上 Windows VMM 效率還蠻好的,而且若你記憶體夠大的話,它反而會先把一些記憶體要來以減少 page fault (所以那堆用 2G RAM 測 Vista 然後狂叫說每個 process 都很肥的,當笑話看看就好)。若你用了 SetProcessWorkingSetSize,但你的程式又不小心要用到已經被 swap 到硬碟上的 page 時要怎麼辦咧?那就 page fault 咩 … 本來可以好好跑的東西莫名其妙 swap out 又 swap in,這樣會快就有鬼了。
部分引用:http://www.cchsu.com/arthur/2007/04/08/130/這兩篇講得蠻詳細的...
http://hi.baidu.com/taobaoshoping/blog/item/a1f6baf52d523a21bd3109f5.html
http://blog.sina.com.cn/s/blog_49f8960e0100081x.html
後來我只好用了另類方法針對這點做優化,因為沒辦法Freelibrary,會造成錯誤...
但還是莫名的多了3倍...就算把Module砍掉也沒用~
所以目前還是需要大概 20,000 K 左右~"~
而且我還沒加入Webbrowser...加了一定會再爆增QQ
對了!還有個問題,不知道為啥調用那DLL後,我的程式關閉會沒辦法順利釋放記憶體(沒關完全)有人知道是為什麼嗎?...只好調用Taskkill來關...
有沒有人提供一些有關優化程序效能的網站阿~
一些比較好的寫法,演算法、習慣之類的...
大大還是要用VB6嗎?!
回覆刪除期待大大的作品 :))
請問此數據如何更新?!
回覆刪除需要更新哪幾個位置?!
能請大大教我嗎?
[ENABLE]
Alloc(ItemStaicICS, 512)
Label(ItemStaicMain)
Label(ItemStaicMain1)
ItemStaicICS:
Cmp [Esp+08], 004DE90E
Jne VariantClear
Mov [Esp+08], ItemStaicMain
Jmp VariantClear
ItemStaicMain:
db 59
db 83 7d e4 02
je 004de919
db 83 7d e4 04
db 8b 45 dc
db 89 5e 48
db 8b 08
jne ItemStaicMain1
db 3b cb
je 004de461
db 68 ff ff ff 00
call 004258d9
db 8d 4e 68
call 00426c54
db 8b ce
db 89 45 c8
call 00426c54
db 33 c9
db 83 7e 2c 03
db 0f 94 c1
db 51
db ff 75 c8
db 50
db 83 c4 0c
db 03 c0
jmp 004dea25
ItemStaicMain1:
call 004258d9
db 8d 4e 68
call 00426c54
db 8b ce
db 89 45 c8
call 00426c54
db 33 c9
db 83 7e 2c 03
db 0f 94 c1
db 51
db ff 75 c8
db 50
jmp 004dea22
00A8228C:
DD ItemStaicICS
[DISABLE]
00A8228C:
DD VariantClear
Dealloc(ItemStaicICS)
小弟幫你整理了一下 :))
刪除至於功能小弟我不確定
//TWMS V1.46.3 快速掉物 [ICS]
[ENABLE]
Alloc(ItemStaicICS, 512)
Label(ItemStaicMain)
Label(ItemStaicMain1)
ItemStaicICS:
CMP [ESP+08],004DE90E
JNE VariantClear
MOV [Esp+08],ItemStaicMain
JMP VariantClear
ItemStaicMain:
POP ECX
CMP [EBP-1C],02
JE 004DE919
CMP [EBP-1C],04
MOV EAX,[EBP-24]
MOV [ESI+48],EBX
MOV ECX,[EAX]
JNE ItemStaicMain1
CMP ECX,EBX
JE 004DE461
PUSH 00FFFFFF
CALL 004258D9
LEA ECX,[ESI+68]
CALL 00426C54
MOV ECX,ESI
MOV [EBP-38],EAX
CALL 00426C54
XOR ECX,ECX
CMP [ESI+2C],03
SETE CL
PUSH ECX
PUSH [EBP-38]
PUSH EAX
ADD ESP,0C
ADD EAX,EAX
JMP 004DEA25
ItemStaicMain1:
CALL 004258D9
LEA ECX,[ESI+68]
CALL 00426C54
MOV ECX,ESI
MOV [EBP-38],EAX
CALL 00426C54
XOR ECX,ECX
CMP [ESI+2C],03
SETE CL
PUSH ECX
PUSH [EBP-38]
PUSH EAX
JMP 004DEA22
00A8228C:
DD ItemStaicICS
[DISABLE]
00A8228C:
DD VariantClear
Dealloc(ItemStaicICS)