快速提問。假設我在 C# 中做這樣的事情:
new HttpClient().GetAsync("www.google.com");
而不是做類似的事情:
HttpClient httpClient = new();
httpClient.GetAsync("www.google.com");
使用第一種方法是否比第二種方法有任何好處(例如,更好的記憶體使用)?如果不是,為什么?
這讓我困惑了一段時間。
uj5u.com熱心網友回復:
不顯著,不。在未優化構建的第二種情況下,它將您的 HttpClient 物件作為區域變數存盤在堆疊上,但優化(在 VS 中發布)構建將消除這種情況。
(但即使是這樣,我現在也不會刻意將我的編碼風格改變幾個位元組。撰寫更易于理解和維護的代碼,而不是試圖削減奇怪的一點點性能。)
令我驚訝的是,這確實對生成的 IL 產生了一點影響:在第一種情況下,編譯器呼叫 GetAsync,而在第二種情況下,它呼叫了它:
IL_000a: call instance class [mscorlib]System.Threading.Tasks.Task`1<class [System.Net.Http]System.Net.Http.HttpResponseMessage> [System.Net.Http]System.Net.Http.HttpClient::GetAsync(string)
IL_000a: callvirt instance class [mscorlib]System.Threading.Tasks.Task`1<class [System.Net.Http]System.Net.Http.HttpResponseMessage> [System.Net.Http]System.Net.Http.HttpClient::GetAsync(string)
我猜在第一種情況下,編譯器確切地知道它在哪個類上呼叫什么方法:在第二種情況下,它允許以某種方式獲得一個 HttpClient 子類的情況。但我不知道這怎么可能發生。同樣,我不認為這是任何顯著的運行時開銷,特別是對于您很少會做的 HTTP 客戶端設定。
要自己進行實驗,您可以例如將一些示例代碼編譯到模塊中,然后使用開發人員命令提示符中的 ildasm 進行檢查
csc example.cs -o -r:System.Net.Http.dll -t:module
ildasm example.netmodule
全部使用最新的 VS2022 生成。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/532986.html
標籤:C#。网表现哎呀优化
