Facebook Sharer
选择您要替换的背景颜色:
【农历新年】背景图片:
个性化设定
 注册  找回密码
查看: 3815|回复: 27
打印 上一主题 下一主题

[分享]如何優化記憶體

[复制链接]

7

主题

1

好友

5108

积分

一流名嘴

Rank: 12Rank: 12Rank: 12

跳转到指定楼层
1#
发表于 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   查看全部评分

收藏收藏0

62

主题

5

好友

3715

积分

本站名嘴

Rank: 11Rank: 11

2#
发表于 2008-11-8 08:32 PM |只看该作者

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


回复

使用道具 举报

13

主题

0

好友

2113

积分

白金长老

Rank: 10

3#
发表于 2008-11-8 11:02 PM |只看该作者
按错 加多了

青菜啦~~


回复

使用道具 举报

7

主题

1

好友

5108

积分

一流名嘴

Rank: 12Rank: 12Rank: 12

4#
发表于 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
复制代码


回复

使用道具 举报

62

主题

5

好友

3715

积分

本站名嘴

Rank: 11Rank: 11

5#
发表于 2008-11-9 09:09 AM |只看该作者

回复 #4 Super-Tomato 的帖子


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


回复

使用道具 举报

7

主题

1

好友

5108

积分

一流名嘴

Rank: 12Rank: 12Rank: 12

6#
发表于 2008-11-9 04:11 PM |只看该作者
原帖由 goodhermit95 于 2008-11-9 09:09 AM 发表

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



我說了這只是針對 Firefox, 所以我只取唯一一個進程, 不明白的函數最好去搜索 msdn 的說明
至於你說全部, 那麼你就該先學習怎麼弄個 TaskManager, 之後就會明白怎麼用了


回复

使用道具 举报

13

主题

0

好友

2113

积分

白金长老

Rank: 10

7#
发表于 2008-11-9 04:49 PM |只看该作者
看到了 番茄的功力
佩服

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


回复

使用道具 举报

62

主题

5

好友

3715

积分

本站名嘴

Rank: 11Rank: 11

8#
发表于 2008-11-9 05:58 PM |只看该作者

回复 #6 Super-Tomato 的帖子

懂了懂了,For Each processs in system.diagnostics.getprocess


回复

使用道具 举报

2

主题

4

好友

5461

积分

一流名嘴

Rank: 12Rank: 12Rank: 12

9#
发表于 2008-11-9 11:48 PM |只看该作者
看似是调用SetProcessWorkingSetSize函数~


回复

使用道具 举报

7

主题

1

好友

5108

积分

一流名嘴

Rank: 12Rank: 12Rank: 12

10#
发表于 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, 2025-1-9 05:11 PM , Processed in 1.964714 second(s), 30 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

Ultra High-performance Dedicated Server powered by iCore Technology Sdn. Bhd.
Domain Registration | Web Hosting | Email Hosting | Forum Hosting | ECShop Hosting | Dedicated Server | Colocation Services
本论坛言论纯属发表者个人意见,与本论坛立场无关
Copyright © 2003-2012 JBTALKS.CC All Rights Reserved
合作联盟网站:
JBTALKS 马来西亚中文论坛 | JBTALKS我的空间 | ICORE TECHNOLOGY SDN. BHD.
回顶部