|
|
|
|
|
|
C#中,new運算符創建一個類型的新實例。但是,請不要瘋狂使用new運算符來創建一個簡單的整型變量(int a = new int(); ),雖然,使用 new 運算符創建一個簡單的整數變量,它會自動設置為 0,并且不會出現“未分配的局部變量”之類的錯誤,但是否真的有必要進行自動分配0?讓我們看看 new 運算符如何降低代碼執行的性能。
不要瘋狂使用 new 運算符來創建整數變量
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Net.NetworkInformation;
namespace Test1
{
class Program
{
static void Main(string[] args)
{
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < 1000; i++)
{
int a = new int();
a = 100;
}
sw.Stop();
Console.WriteLine("Using New operator:- " + sw.ElapsedTicks);
sw.Restart();
for (int i = 0; i < 1000; i++)
{
int a;
a = 100;
}
sw.Stop();
Console.WriteLine("Without new operator:- "+ sw.ElapsedTicks);
Console.ReadLine();
}
}
}
下面是執行結果

可以看到,new運算符將執行速度降低了 5 倍,因此,不要瘋狂使用 new 運算符來創建整數變量。
使用StringBuilder連接字符串
在 C#/.NET 中,字符串是不可變的。因此,每次你執行一些看起來像是在更改字符串的操作時,它們實際上是在創建一個新字符串。此類操作包括 Replace 和 Substring 等方法,但也包括連接。
小心連接大量字符串,尤其是在循環內。
這里的提示很簡單——注意不要連接大量字符串,尤其是在循環內。在這種情況下,請使用 System.Text.StringBuilder 類,而不是使用“+”運算符。這將確保不會為你連接的每個部分創建新實例。
結論
內存位置很重要
我們看看下面的兩段for循環代碼,它們很相似,但是速度一樣嗎?哪個更快?
代碼 1
for (int i = 0; i < _map.Length; i++)
{
for (int n = 0; n < _map.Length; n++)
{
if (_map[i][n] > 0)
{
result++;
}
}
}
代碼 2
for (int i = 0; i < _map.Length; i++)
{
for (int n = 0; n < _map.Length; n++)
{
if (_map[n][i] > 0)
{
result++;
}
}
}
在測試中,這個循環上獲得了大約 8 倍的性能提升!
注意到區別了嗎?這是我們遍歷這個數組的順序([i][n] 與 [n][i])。內存局部性在 .NET 中確實很重要,盡管我們已經完全擺脫了自己管理內存的問題。
雖然 .NET 是面向對象的,但你仍然需要在內存分配中尋找性能提升機會。
總結
不要讓 C# 錯誤拖慢你的代碼速度,本文是對提高 .NET 代碼的性能有用的一些技巧,花時間檢查你的代碼以確保它的性能并及時了解更新是值得的。
相關文章
