|
|
|
|
|
C#中,new
運算符創(chuàng)建一個類型的新實例。但是,請不要瘋狂使用new
運算符來創(chuàng)建一個簡單的整型變量(int a = new int();
),雖然,使用 new
運算符創(chuàng)建一個簡單的整數(shù)變量,它會自動設(shè)置為 0,并且不會出現(xiàn)“未分配的局部變量”之類的錯誤,但是否真的有必要進行自動分配0?讓我們看看 new
運算符如何降低代碼執(zhí)行的性能。
不要瘋狂使用 new 運算符來創(chuàng)建整數(shù)變量
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();
}
}
}
下面是執(zhí)行結(jié)果
可以看到,new
運算符將執(zhí)行速度降低了 5 倍,因此,不要瘋狂使用 new
運算符來創(chuàng)建整數(shù)變量。
使用StringBuilder連接字符串
在 C#/.NET 中,字符串是不可變的。因此,每次你執(zhí)行一些看起來像是在更改字符串的操作時,它們實際上是在創(chuàng)建一個新字符串。此類操作包括 Replace
和 Substring
等方法,但也包括連接。
小心連接大量字符串,尤其是在循環(huán)內(nèi)。
這里的提示很簡單——注意不要連接大量字符串,尤其是在循環(huán)內(nèi)。在這種情況下,請使用 System.Text.StringBuilder
類,而不是使用“+”運算符。這將確保不會為你連接的每個部分創(chuàng)建新實例。
結(jié)論
內(nèi)存位置很重要
我們看看下面的兩段for
循環(huán)代碼,它們很相似,但是速度一樣嗎?哪個更快?
代碼 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++;
}
}
}
在測試中,這個循環(huán)上獲得了大約 8 倍的性能提升!
注意到區(qū)別了嗎?這是我們遍歷這個數(shù)組的順序([i][n] 與 [n][i])。內(nèi)存局部性在 .NET 中確實很重要,盡管我們已經(jīng)完全擺脫了自己管理內(nèi)存的問題。
雖然 .NET 是面向?qū)ο蟮模闳匀恍枰趦?nèi)存分配中尋找性能提升機會。
總結(jié)
不要讓 C# 錯誤拖慢你的代碼速度,本文是對提高 .NET 代碼的性能有用的一些技巧,花時間檢查你的代碼以確保它的性能并及時了解更新是值得的。
相關(guān)文章