在記憶體當道的日子裡,無論什麼時候都要考慮這些**是否會影響程式效能呢?
在現在的世界裡,幾乎不會去考慮用了幾百毫秒,可是在特別的場景了,往往這幾百公釐確影響了整個專案的快慢。
通過了解這兩者之間的效能差異,希望幫助大家在合適的場景裡選擇正確的編碼。
public class pointclass
public int y
public pointclass(int x, int y)
}public class pointclassfinalized : pointclass
~pointclassfinalized()
}public struct pointstruct
public int y
public pointstruct(int x, int y)
}public class structstest : performancetest
return true;
}protected override bool measuretestb()
return true;
}protected override bool measuretestc()
return true;}}
有乙個pointclass
和乙個pointstruct
,這兩者用於存放x 和y 兩個變數,而且還有乙個pointclassfinalized
。
方法measuretesta
建立了100萬個pointclassfinalized
例項
方法measuretestb
建立了100萬個pointclass
例項
方法measuretestc
建立了100萬個pointstruct
例項
您認為哪種方法最快?
measuretestb
和measuretestc
這兩個方法的唯一不同在於乙個是建立類 乙個是建立結構。
measuretestc
僅在17毫秒內完成分配並執行,比measuretestb
方法快8.6倍!
為什麼會出現這樣的事情,這裡發生了什麼?
不同的在於結構和類如何儲存在記憶體中。
下面是pointclass
例項 記憶體布局:
該列表是乙個區域性變數,存放在堆疊中。引用堆上的一組pointclass
例項
pointclass
是乙個引用型別,存放在堆上。
該列表僅維護乙個陣列,指向儲存在堆上pointclass
例項。
觀察到上圖的黃色箭頭,在堆上引用了很多例項。
陣列是一組相同的物件,measuretestb
這個方法是將一組相同的物件存放在陣列中。
當訪問指定陣列元素時,.net執行時需要檢索物件引用,然後「跟隨」引用以獲取pointclass
例項。
當陣列元素超出範圍時,.net垃圾收集器就會開始**pointclass
物件記憶體,在measuretesta
方法中 的pointclassfinalized
類 其實增加了額外時間。
.net framework在單個執行緒上執行所有終結器,執行緒必須在垃圾**器可以**記憶體之前依次處理1,000,000個物件。
可以看到measuretesta
比measuretestb
慢1.7倍。
我們來看看pointstruct
的記憶體布局:
結構是值型別,所有pointstruct
例項都儲存在陣列本身中。堆上只有乙個物件。
初始化陣列,.net執行庫可以將x和y值直接寫入陣列裡。無需在堆上建立新物件,也不需要引用它。
當訪問指定陣列元素時,.net執行時可以直接檢索結構。
當超出範圍時,.net垃圾**器只需要處理單個物件。
我們總要使用結構嗎?要分情況看:
C 與C 誰更強?還是關公戰秦瓊
我一直不明白c 真的比c 強大嗎?望高手指點。困惑1.為什麼飛信之前的版本用.net做的,感覺不是很好用,最終放棄了.net而使用c 重寫了。感覺重寫之後的版本好一點。難道是他們的技術不好?還是c 真的比c 強大嗎?困惑2 為什麼qq一直使用c 開發。雖然qq開發的時候c 還是最主流的,c 還不是那...
C 中的結構與類
c corner今天發表了bechir bejaoui的一篇文章 what really make difference between structures and classes?關於結構和類的區別其實是老生常談,不過本文總結得較為全面,所以翻譯過來給大家共享。總結起來,兩者共有如下區別 2 據...
C 中的結構與類
c corner 今天發表了bechir bejaoui的一篇文章 what really make difference between structures and classes?總結起來,兩者共有如下區別 2 據第1點可以得出結論,那就是類物件通常用來傳遞大資料,而結構物件則用來傳遞小資料。...