技术频道导航
HTML/CSS
.NET技术
IIS技术
PHP技术
Js/JQuery
Photoshop
Fireworks
服务器技术
操作系统
网站运营

赞助商

分类目录

赞助商

最新文章

搜索

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

作者:admin    时间:2023-5-6 17:2:58    浏览:

本文将通过示例,对比有无指定List集合​​容量的情况下,其程序运行速度的快慢,这是一个有意思的测试。

代码如下:

[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);
    }
}

这两种方法完成相同的任务——使用foreach循环填充整数集合。唯一的区别是在FixedCapacityTest方法中构造函数被初始化为某个数字。这个简单的技巧使其运行速度是NonFixedCapacityTest的2倍。

 

因为它的List<T>的实现方式是将元素存储在数组中,数组是固定大小的数据结构。当开发人员List<T>在未指定其容量的情况下进行实例化时,将分配一个默认容量数组。当数组已满时,将分配一个新的更大的数组,并将旧数组中的值复制到新数组中。

提前指定容量可以消除分配、复制和旧数组垃圾回收的开销。指定集合的​​容量应该是开发人员的默认选择,如果他们事先知道有多少项目将被添加到集合中。

容量设置不仅适用于 List 集合,还适用于其他集合,例如Dictionary<TKey, TValue>HashSet<T>等等。

有时结构(struct)比类(class)速度快得多

开发人员通常可能需要分配一个数组或List<T>在内存中存储数万个对象。这个任务可以使用类或结构来解决。

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之间的唯一区别是第一个测试创建类的实例PointClass,而第二个测试创建结构的实例PointStruct。运行结果是使用结构的代码比使用类的代码运行速度快 15 倍。

 

存在如此大的时间差异是因为在类的情况下,CLR 必须将一百万个对象分配到托管堆并将它们的引用存储回集合List<T>。在结构的情况下,将有唯一的对象分配到托管堆中,它是集合List<T>的实例 ,一百万个结构将嵌入到该单个集合实例中。

相关文章

标签: CSharp  asp.net  List方法  代码性能  优化  
x
  • 站长推荐
/* 左侧显示文章内容目录 */