C 記憶體分配效能測試

2021-08-27 18:28:08 字數 1416 閱讀 5332

一、在64位應用下對c#的物件和結構記憶體分配做了效能測試,測試結果如下

二、結論

1、gc.gettotalmemory獲得的並非物理記憶體,而是runtime自己統計的記憶體。

2、新建陣列時,沒有立即分配物理記憶體,而是分配了虛擬記憶體。

3、64位下物件預設占用16位元組(物件指標和同步塊索引),結構體沒有類似的內容,如果不得不減少記憶體占用,可以考慮用結構體。

4、大量小物件的分配比較耗時,每1m*32耗費74ms。

5、總大小1.6g的結構體陣列分配耗時很小,大概200ms。

三、原始碼

public class classmemory

public struct structmemory

public class memorytest

long m3 = gc.gettotalmemory(false);

long t3 = s.elapsedmilliseconds;

long m4 = gc.gettotalmemory(false);

long t4 = s.elapsedmilliseconds;

structmemory minstructarr = new structmemory[minmemorylen];

long m5 = gc.gettotalmemory(false);

long t5 = s.elapsedmilliseconds;

for (int i = 0; i < minmemorylen; i++)

long m6 = gc.gettotalmemory(false);

long t6 = s.elapsedmilliseconds;

for (int i = 0; i < minmemorylen; i++)

long m7 = gc.gettotalmemory(false);

long t7 = s.elapsedmilliseconds;

console.writeline((t2 - t1) + " " + (t3-t2));

console.writeline((m2 - m1) + " " + (m3 - m2));

console.writeline((t5 - t4) + " " + (t6 - t5) + " " + (t7 - t6));

console.writeline((m5 - m4) + " " + (m6 - m5) + " " + (m7 - m6));}}

四、輸出結果

C 記憶體分配

總結 1 從靜態儲存區域分配。內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。例如全域性變數,static變數。2 在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的指令集中,效率很高,但是...

C 記憶體分配

c 中的記憶體主要分為五塊 全域性區 static 存放全域性變數或靜態變數 常量區 const 存放常量,不允許修改 可以通過特殊手段修改 堆 heap 由使用者自行分配和釋放,在程式執行時分配。由malloc分配,由free釋放 自由儲存區 free store 由new分配,由delete釋放...

C 記憶體分配

在c 中,記憶體分成4個區,他們分別是堆,棧,靜態儲存區和常量儲存區 1 棧,就是那些由編譯器在需要的時候分配,在不需要的時候自動清除的變數的儲存區.裡面的變數通常是區域性變數,函式引數等.2 堆,又叫自由儲存區,它是在程式執行的過程中動態分配的,它最大的特性就是動.態性.由new分配的記憶體塊,他...