一、在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分配的記憶體塊,他...