|登录 |注册

查看: 4275|回复: 27
打印 上一主题 下一主题

[分享]如何優化記憶體

[复制链接]
Super-Tomato
2008-11-8 01:03 PM
作者 : Super-Tomato


昨天看到了篇帖子寫到 Firefox 記憶體溢出的問題, 所以今天周末有空就來分享如何優化記憶體分配的編程
一開始未看到這篇文章前, 應該很多人都認為這是個很複雜的技術, 但看完之後會偷笑原來這是那麼簡單就可以實現的
沒錯, 在早期要優化記憶體這種技術應該很複雜也輪不到我這種菜鳥來寫, 但 Windows 已經把這項工程給簡化了,
所以我們只要輕鬆的套用 WINAPI 就能夠解決這個問題.


那麼到底要用哪些 WINAPI 呢??
最主要的當然就是使用 EmptyWorkingSet 回收記憶體了, 這一個函數可以大大改善記憶體的使用, 至於說明就請搜索微軟的 WINAPI 吧

p/s: 但是要記得的是縮小了記憶體並非代表程式的執行速度加快了

以下是以 BCB 針對 Firefox 做為範例和演示

  1. //---------------------------------------------------------------------------

  2. #include <vcl.h>
  3. #include <psapi.h>
  4. #pragma comment(lib, "psapi.lib")
  5. #pragma hdrstop

  6. #include "Unit1.h"
  7. //---------------------------------------------------------------------------
  8. #pragma package(smart_init)
  9. #pragma resource "*.dfm"
  10. TForm1 *Form1;
  11. //---------------------------------------------------------------------------
  12. __fastcall TForm1::TForm1(TComponent* Owner)
  13.         : TForm(Owner)
  14. {
  15. }
  16. //---------------------------------------------------------------------------
  17. void __fastcall TForm1::Timer1Timer(TObject *Sender)
  18. {
  19.         HWND firefox = FindWindow("MozillaUIWindowClass", NULL);
  20.         if(firefox)
  21.         {
  22.                 DWORD dProcessID;
  23.                 HANDLE hProcess;

  24.                 GetWindowThreadProcessId(firefox, &dProcessID);
  25.                 if(dProcessID)
  26.                 {
  27.                         hProcess = OpenProcess(PROCESS_ALL_ACCESS, true, dProcessID);
  28.                         if(hProcess)
  29.                         {
  30.                                 SetProcessWorkingSetSize(hProcess, 0, 0);
  31.                                 EmptyWorkingSet(hProcess);
  32.                                 CloseHandle(hProcess);
  33.                         }
  34.                 }
  35.         }
  36. }
  37. //---------------------------------------------------------------------------

复制代码



演示(非永久性連結)

[ 本帖最后由 Super-Tomato 于 2008-11-8 01:09 PM 编辑 ]
已有 1 人评分 积分 收起 理由
goodday + 5 原创内容

总评分:  积分 + 5   查看全部评分

goodhermit95
2008-11-8 08:32 PM

C++ Declare API真方便
请问可以翻译成C#.NET或VB.NET 吗?
goodday
2008-11-8 11:02 PM
按错 加多了

青菜啦~~
Super-Tomato
2008-11-9 01:42 AM
原帖由 goodhermit95 于 2008-11-8 08:32 PM 发表

C++ Declare API真方便
请问可以翻译成C#.NET或VB.NET 吗?



所有的語言都一樣, 只是你沒看到 header 檔怎麼定義了 Entry Point
VB.NET 做法也一樣啊, 簡單的例子就是

  1. Public Class Form1

  2.     Declare Function FindWindow Lib "user32" Alias "FindWindowW" (ByVal lpClassName As String, ByVal lpWindowName As String) As Integer

  3.     Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
  4.         Dim firefox As IntPtr

  5.         firefox = FindWindow("MozillaUIWindowClass", vbNullString)
  6.         If Not firefox.Equals(0) Then
  7.             Debug.Print("Found Firefox!!")
  8.         End If
  9.     End Sub
  10. End Class
复制代码

回复 #4 Super-Tomato 的帖子

goodhermit95
2008-11-9 09:09 AM

看到了
哪么优化的部分是一样的吧?
如果要优化全部,那么要用For Each吗?
Super-Tomato
2008-11-9 04:11 PM
原帖由 goodhermit95 于 2008-11-9 09:09 AM 发表

看到了
哪么优化的部分是一样的吧?
如果要优化全部,那么要用For Each吗?



我說了這只是針對 Firefox, 所以我只取唯一一個進程, 不明白的函數最好去搜索 msdn 的說明
至於你說全部, 那麼你就該先學習怎麼弄個 TaskManager, 之後就會明白怎麼用了
goodday
2008-11-9 04:49 PM
看到了 番茄的功力
佩服

我只专.net 你好像全部都 会

回复 #6 Super-Tomato 的帖子

goodhermit95
2008-11-9 05:58 PM
懂了懂了,For Each processs in system.diagnostics.getprocess
late_boy
2008-11-9 11:48 PM
看似是调用SetProcessWorkingSetSize函数~
Super-Tomato
2008-11-10 03:02 AM
原帖由 goodday 于 2008-11-9 04:49 PM 发表
看到了 番茄的功力
佩服

我只专.net 你好像全部都 会


都懂一些些混口飯吃而已, 最重要的還是貴在精...



原帖由 goodhermit95 于 2008-11-9 05:58 PM 发表
懂了懂了,For Each processs in system.diagnostics.getprocess


希望你別讓系統崩潰了



原帖由 late_boy 于 2008-11-9 11:48 PM 发表
看似是调用SetProcessWorkingSetSize函数~


SetProcessWorkingSetSize 中說明了大小都設定為 -1 的時候會移除Paging, 但對於 Win2K 和 Win2003 Server 來說沒打上補丁的系統來說完全沒反應, 所以配合 EmptyWorkingSet 是個互補. 當然在有了補丁的情況下使用前者更為方便, 因為根本不用再嵌入任何 dll


補充 :  
http://support.microsoft.com/kb/823684

[ 本帖最后由 Super-Tomato 于 2008-11-10 05:44 AM 编辑 ]
您需要登录后才可以回帖 登录 | 注册

JBTALKS.CC |联系我们 |隐私政策 |Share

GMT+8, 2026-4-27 08:50 PM , Processed in 0.094007 second(s), 27 queries .

Powered by Discuz! X2.5 © 2001-2012 Comsenz Inc.

本论坛言论纯属发表者个人意见,与本论坛立场无关
Copyright © 2003-2012 JBTALKS.CC All Rights Reserved

Dedicated Server powered by iCore Technology Sdn. Bhd.

合作联盟网站:
JBTALKS 马来西亚中文论坛 | JBTALKS我的空间 | ICORE TECHNOLOGY SDN. BHD.
回顶部