Re: [問題] Memory Usage

作者: Usoul   2012-03-02 18:45:58
有鑑於大家對於tm_usage中的memory usage有眾多疑問,在此做統一回答。
測試過程:
以 demo/src/main.cpp 為例:
tmusg.periodStart();
...
(即將插入測試程式碼)
tmusg.getPeriodUsage(stat);
...
cout << stat.vmSize / 1024.0 << "MB" << endl; // print current memory
cout << stat.vmPeak / 1024.0 << "MB" << endl; // print peak memory
cout << stat.vmDiff / 1024.0 << "MB" << endl;
測試0: 什麼都不做的情況下
11.2969MB
11.2969MB
0.00390625MB
測試1: 加入int test[1000000];
15.0391MB
15.0391MB
0.00390625MB
由測試0&1之差別,我們可以發現 (15.0391-11.2969)x1024x1024/4 ~= 1000000
測試2: 加入int* test; test = new int[1000000];
15.1133MB
15.1133MB
3.82031MB
測試3: 加入int* test; test = new int[1000000]; delete test;
11.2969MB
15.1094MB
0.00390625MB
由以上四個測試,我們可以得到以下結論:
1. 程式在執行前,系統會先給予一塊足夠的記憶體,並且某些情況下不需要再增加。
這就是為什麼 Craig 的測試會發現 vmDiff 並沒有變化的原因。
2. 在使用 pointer 時,系統並不會預估 new 出的記憶體大小,而會動態給予記憶體。
因此,這時候 vmDiff 就有用武之地了。
以上分析都不重要,大家只需要知道一件事。
本次作業的 memory usage ,請在 main.cpp 中使用以下模板:
tmusg.periodStart();
... (這裡就是許多sorting的程式碼)
tmusg.getPeriodUsage(stat);
cout << stat.vmPeak << "KB" << endl;
其中 tmusg.XXX 的位置都不要動,只需要在 main return 出去前,
加上那一行 stat.vmPeak 即可。
本次作業之 memory usage ,就以輸出之 stat.vmPeak 為準。
作者: craig08 (小佑)   2012-03-03 14:10:00
推助教~
作者: fu3mo6 (ㄚ龐)   2012-03-03 20:04:00
所以totalstart和gettotal..兩個都不需要用到嗎?
作者: Usoul   2012-03-03 21:04:00
在本次作業中確實不需要用到。
作者: Nien1027 (隨便)   2012-03-03 21:13:00
感謝助教!!
作者: anfranion (南‧生命的意義是經歷)   2012-03-05 16:17:00
話說輸出的單位是MB嗎? spec.上好像是kb...
作者: Usoul   2012-03-06 00:35:00
啊,這點是我疏忽了。已改成KB,以免造成沒注意到這篇文的人會有不同的結果

Links booklink

Contact Us: admin [ a t ] ucptt.com