技術(shù)頻道導(dǎo)航
HTML/CSS
.NET技術(shù)
IIS技術(shù)
PHP技術(shù)
Js/JQuery
Photoshop
Fireworks
服務(wù)器技術(shù)
操作系統(tǒng)
網(wǎng)站運(yùn)營(yíng)

贊助商

分類(lèi)目錄

贊助商

最新文章

搜索

[C#技巧]new運(yùn)算符使代碼執(zhí)行速度慢了5倍

作者:admin    時(shí)間:2023-5-5 10:53:52    瀏覽:

C#中,new運(yùn)算符創(chuàng)建一個(gè)類(lèi)型的新實(shí)例。但是,請(qǐng)不要瘋狂使用new運(yùn)算符來(lái)創(chuàng)建一個(gè)簡(jiǎn)單的整型變量(int a = new int(); ),雖然,使用 new 運(yùn)算符創(chuàng)建一個(gè)簡(jiǎn)單的整數(shù)變量,它會(huì)自動(dòng)設(shè)置為 0,并且不會(huì)出現(xiàn)“未分配的局部變量”之類(lèi)的錯(cuò)誤,但是否真的有必要進(jìn)行自動(dòng)分配0?讓我們看看 new 運(yùn)算符如何降低代碼執(zhí)行的性能。

不要瘋狂使用 new 運(yùn)算符來(lái)創(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運(yùn)算符將執(zhí)行速度降低了 5 倍

可以看到,new運(yùn)算符將執(zhí)行速度降低了 5 倍,因此,不要瘋狂使用 new 運(yùn)算符來(lái)創(chuàng)建整數(shù)變量。

使用StringBuilder連接字符串

在 C#/.NET 中,字符串是不可變的。因此,每次你執(zhí)行一些看起來(lái)像是在更改字符串的操作時(shí),它們實(shí)際上是在創(chuàng)建一個(gè)新字符串。此類(lèi)操作包括 ReplaceSubstring 等方法,但也包括連接。

小心連接大量字符串,尤其是在循環(huán)內(nèi)。

這里的提示很簡(jiǎn)單——注意不要連接大量字符串,尤其是在循環(huán)內(nèi)。在這種情況下,請(qǐng)使用 System.Text.StringBuilder 類(lèi),而不是使用“+”運(yùn)算符。這將確保不會(huì)為你連接的每個(gè)部分創(chuàng)建新實(shí)例。

結(jié)論

  • 你不是在修改字符串,而是在創(chuàng)建它們,因此請(qǐng)避免對(duì)多個(gè)字符串執(zhí)行批量操作
  • 改為使用 System.Text.StringBuilder。

內(nèi)存位置很重要

我們看看下面的兩段for循環(huán)代碼,它們很相似,但是速度一樣嗎?哪個(gè)更快?

代碼 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++;
        }
    }
}

在測(cè)試中,這個(gè)循環(huán)上獲得了大約 8 倍的性能提升!

注意到區(qū)別了嗎?這是我們遍歷這個(gè)數(shù)組的順序([i][n] 與 [n][i])。內(nèi)存局部性在 .NET 中確實(shí)很重要,盡管我們已經(jīng)完全擺脫了自己管理內(nèi)存的問(wèn)題。

雖然 .NET 是面向?qū)ο蟮?,但你仍然需要在?nèi)存分配中尋找性能提升機(jī)會(huì)。

總結(jié)

不要讓 C# 錯(cuò)誤拖慢你的代碼速度,本文是對(duì)提高 .NET 代碼的性能有用的一些技巧,花時(shí)間檢查你的代碼以確保它的性能并及時(shí)了解更新是值得的。

相關(guān)文章

x
  • 站長(zhǎng)推薦
/* 左側(cè)顯示文章內(nèi)容目錄 */