楓之谷洋蔥很肥的迷思

楓之谷洋蔥很肥的迷思

之前寫的楓之谷洋蔥因為耗用太多記憶體結果害我沒有繼續維護,
最近就打算重寫...重寫到一半才發現是佔用我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來關...

有沒有人提供一些有關優化程序效能的網站阿~
一些比較好的寫法,演算法、習慣之類的...

留言

  1. 大大還是要用VB6嗎?!



    期待大大的作品 :))

    回覆刪除
  2. 請問此數據如何更新?!
    需要更新哪幾個位置?!

    能請大大教我嗎?


    [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)

    回覆刪除
    回覆
    1. 小弟幫你整理了一下 :))
      至於功能小弟我不確定

      //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)

      刪除

張貼留言

本月最夯