[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});
}
}
可以看到, ListOfObjectTest
和ListOfStructsTest
之间的唯一区别是第一个测试创建类的实例PointClass
,而第二个测试创建结构的实例PointStruct
。运行结果是使用结构的代码比使用类的代码运行速度快 15 倍。
存在如此大的时间差异是因为在类的情况下,CLR 必须将一百万个对象分配到托管堆并将它们的引用存储回集合List<T>
。在结构的情况下,将有唯一的对象分配到托管堆中,它是集合List<T>
的实例 ,一百万个结构将嵌入到该单个集合实例中。
相关文章
- [C#技巧]C#进行空(null)检查的正确方法:用is代替==
- [C#技巧]C#数组矩阵for迭代,顺序不同竟然速度相差15倍
- [C#技巧]C#返回空集合的正确方法是使用Array.Empty而不是null
- [C#技巧]C#异常when过滤器捕捉异常使用多个catch的示例代码
- [C#技巧]C#重新抛出异常的正确方法,注意不是throw e!
- [C#技巧]从C#到C# 8、C# 9,简化switch语句越来越惊艳
- [C#技巧]使用using块比没有using块语句消耗更少的内存
- [C#技巧]使用StringBuilder比String消耗内存少
- [C#技巧]new运算符使代码执行速度慢了5倍
- [C#技巧]在for循环外比在for循环内使用try-catch速度快
- 11个提高C#代码性能的技巧
- OutputCache缓存优化asp.net代码 提高网页性能
- 站长推荐