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

贊助商

分類目錄

贊助商

最新文章

搜索

[C#技巧]指定List集合??容量,速度提升2倍

作者:admin    時(shí)間:2023-5-6 17:2:58    瀏覽:

本文將通過示例,對(duì)比有無指定List集合??容量的情況下,其程序運(yùn)行速度的快慢,這是一個(gè)有意思的測試。

代碼如下:

[Benchmark]
public void NonFixedCapacityTest()
{
    var items = new List<decimal>();
    for (int i = 0; i < 1000000; i++)
    {
        items.Add(i);
    }
}

[Benchmark]
public void FixedCapacityTest()
{
    const int capacity = 1000000;
    var items = new List<decimal>(capacity);
    for (int i = 0; i < capacity; i++)
    {
        items.Add(i);
    }
}

這兩種方法完成相同的任務(wù)——使用foreach循環(huán)填充整數(shù)集合。唯一的區(qū)別是在FixedCapacityTest方法中構(gòu)造函數(shù)被初始化為某個(gè)數(shù)字。這個(gè)簡單的技巧使其運(yùn)行速度是NonFixedCapacityTest的2倍。

 

因?yàn)樗?code>List<T>的實(shí)現(xiàn)方式是將元素存儲(chǔ)在數(shù)組中,數(shù)組是固定大小的數(shù)據(jù)結(jié)構(gòu)。當(dāng)開發(fā)人員List<T>在未指定其容量的情況下進(jìn)行實(shí)例化時(shí),將分配一個(gè)默認(rèn)容量數(shù)組。當(dāng)數(shù)組已滿時(shí),將分配一個(gè)新的更大的數(shù)組,并將舊數(shù)組中的值復(fù)制到新數(shù)組中。

提前指定容量可以消除分配、復(fù)制和舊數(shù)組垃圾回收的開銷。指定集合的??容量應(yīng)該是開發(fā)人員的默認(rèn)選擇,如果他們事先知道有多少項(xiàng)目將被添加到集合中。

容量設(shè)置不僅適用于 List 集合,還適用于其他集合,例如Dictionary<TKey, TValue>, HashSet<T>等等。

有時(shí)結(jié)構(gòu)(struct)比類(class)速度快得多

開發(fā)人員通常可能需要分配一個(gè)數(shù)組或List<T>在內(nèi)存中存儲(chǔ)數(shù)萬個(gè)對(duì)象。這個(gè)任務(wù)可以使用類或結(jié)構(gòu)來解決。

public class PointClass
{
    public int X { get; set; }
    public int Y { get; set; }
}

public struct PointStruct
{
    public int X { get; set; }
    public int Y { get; set; }
}

[Benchmark]
public void ListOfObjectsTest()
{
    const int length = 1000000;

    var items = new List<PointClass>(length);

    for (int i = 0; i < length; i++)
    {
        items.Add(new PointClass() { X = i, Y = i });
    }
}

[Benchmark]
public void ListOfStructsTest()
{
    const int length = 1000000;

    var items = new List<PointStruct>(length);

    for (int i = 0; i < length; i++)
    {
        items.Add(new PointStruct() { X = i, Y = i});
    }
}

可以看到, ListOfObjectTestListOfStructsTest之間的唯一區(qū)別是第一個(gè)測試創(chuàng)建類的實(shí)例PointClass,而第二個(gè)測試創(chuàng)建結(jié)構(gòu)的實(shí)例PointStruct。運(yùn)行結(jié)果是使用結(jié)構(gòu)的代碼比使用類的代碼運(yùn)行速度快 15 倍。

 

存在如此大的時(shí)間差異是因?yàn)樵陬惖那闆r下,CLR 必須將一百萬個(gè)對(duì)象分配到托管堆并將它們的引用存儲(chǔ)回集合List<T>。在結(jié)構(gòu)的情況下,將有唯一的對(duì)象分配到托管堆中,它是集合List<T>的實(shí)例 ,一百萬個(gè)結(jié)構(gòu)將嵌入到該單個(gè)集合實(shí)例中。

相關(guān)文章

標(biāo)簽: CSharp  asp.net  List方法  代碼性能  優(yōu)化  
x
  • 站長推薦
/* 左側(cè)顯示文章內(nèi)容目錄 */