2012-07-24 30 views
1

我寫了一個內存分配器,(這應該是)比使用malloc/free更快。 我寫了一小段代碼來測試這個,但我不確定這是否是分配內存分配器的正確方法,任何人都可以給我一些建議嗎?正確的方式來分析內存分配

這段代碼的輸出是:

Mem_Alloc: 0.020000s 
malloc: 3.869000s 
difference: 3.849000s 
Mem_Alloc is 193.449997 times faster. 

這是代碼:

int i; 
int mem_alloc_time, malloc_time; 
float mem_alloc_time_float, malloc_time_float, times_faster; 
unsigned prev; 

// Test Mem_Alloc 
timeBeginPeriod (1); 
mem_alloc_time = timeGetTime(); 

for (i = 0; i < 100000; i++) { 
    void *p = Mem_Alloc (100000); 
    Mem_Free (p); 
} 

// Get the duration 
mem_alloc_time = timeGetTime() - mem_alloc_time; 

// Test malloc 
prev = mem_alloc_time; // For getting the difference between the two times 
malloc_time = timeGetTime(); 

for (i = 0; i < 100000; i++) { 
    void *p = malloc (100000); 
    free (p); 
} 

// Get the duration 
malloc_time = timeGetTime() - malloc_time; 
timeEndPeriod (1); 

// Convert both times to seconds 
mem_alloc_time_float = (float)mem_alloc_time/1000.0f; 
malloc_time_float = (float)malloc_time/1000.0f; 

// Print the results 
printf ("Mem_Alloc: %fs\n", mem_alloc_time_float); 
printf ("malloc: %fs\n", malloc_time_float); 

if (mem_alloc_time_float > malloc_time_float) { 
    printf ("difference: %fs\n", mem_alloc_time_float - malloc_time_float); 
} else { 
    printf ("difference: %fs\n", malloc_time_float - mem_alloc_time_float); 
} 

times_faster = (float)max(mem_alloc_time_float, malloc_time_float)/
    (float)min(mem_alloc_time_float, malloc_time_float); 
printf ("Mem_Alloc is %f times faster.\n", times_faster); 
+0

'timeGetTime()'做了什麼? – steffen 2012-07-24 10:20:23

+0

http://msdn.microsoft.com/en-us/library/windows/desktop/dd757629(v=vs.85).aspx – 2012-07-24 18:28:20

回答

0

無人問津[*]您分配是否比它們的分配器更快或更慢,在分配和再立即釋放100k塊100k次。這不是一種常見的內存分配模式(對於出現的任何情況,有可能比使用內存分配器更好地進行優化,例如,通過alloca使用堆棧或使用靜態數組)。

人們很關心你的分配器是否會加快他們的應用程序。

選擇一個真實的應用程序。使用兩種不同的分配器研究其在分配繁重的任務中的性能,並對其進行比較。然後研究更多的分配任務。

僅舉一個例子,您可以比較啓動Firefox和加載StackOverflow首頁的時間。您可以模擬網絡(或者至少使用本地HTTP代理),從測試中刪除大量的隨機變量。您也可以使用一個分析器來查看在malloc中花費了多少時間,從而判斷該任務是否分配很重,但要注意像「overcommit」這樣的內容可能意味着並非所有的內存分配成本都在malloc中支付。

如果你編寫了分配器來加快你自己的應用程序,你應該使用你自己的應用程序。

有一點需要注意的是,在最壞的情況下,人們通常在分配器中想要的是好的行爲。也就是說,如果你的分配器的速度比默認的大多數時間快99.5%,但是如果它在內存碎片化的情況下效果相當不好,那麼你最終會失敗,因爲Firefox運行了幾個小時,那麼就不能再分配內存而摔倒了。然後你意識到爲什麼默認會花費這麼長的時間來處理一件看似微不足道的任務。

[*]這可能看起來很刺耳。沒有人關心,無論是苛刻的;-)

+0

感謝您的回答,它可以幫助我,而且它並不苛刻。 :) – 2012-07-24 09:27:11

+0

每當我的分配器釋放一個塊時,它會查看該塊的前面塊,如果這些塊也是空閒塊,則它們將它們合併在一起,這應該在一定程度上停止碎片化。 – 2012-07-24 09:50:47

0

你所有的實現要針對缺少的檢查,如果數據包的電流的大小是相同的測試如以前炒一個:

if(size == prev_free->size) 
{ 
    current = allocate(prev_free); 
    return current; 
} 

這是「小事」,使高效用於內存的malloc/free函數,直到內存不被分段。挑戰在於當你分配大量不同大小的內存時,你會嘗試釋放一些內存,然後分配一些不需要的特定命令。

您必須檢查您針對哪種庫進行了測試,並檢查該庫的優化條件。

  • 去碎片化的內存處理效率
  • 快速免費,快速的malloc(你可以讓任何一個O(1)),
  • 內存佔用
  • 多處理器支持
  • realloc的

檢查現有的實施和他們遇到的問題,並嘗試改善或解決他們遇到的困難。嘗試弄清楚用戶對圖書館的期望。

對這個假設進行測試,而不僅僅是一些你認爲重要的操作。