提出问题:在需求开发过程,每100ms从传感器中读取一个大小为3500个double元素的数组,缓存数据时采用的是方式A:使用先Clear再进行AddRange的方式,随着理解的深入,发现这不是一个好的方式,列表的Clear与AddRange存在较大的内存开销。
解决方案:采用方式B:直接Replace列表中的元素,减少内存开销。通过BenchmarkDotNet的测试两种实现方式的进行性能比较,结果显示新方式较原来有极大改善。
分析原因:方式A存在耗时的内存开销.
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Engines;
using BenchmarkDotNet.Running;
using System;
using System.Text;
namespace MyApp // Note: actual namespace depends on the project name.
{
public class FooPerf
{
public double[] TestArray = new double[100];
public List<double> list1 = new List<double>();
public List<double> list2 = new List<double>(100);
[Benchmark]
public void ClearListElement()
{
//TODO:先Clear,再进行AddRange
list1.Clear();
list1.AddRange(TestArray);
}
[Benchmark(Baseline = true)]
public void ReplaceListElement()
{
//TODO: 直接Replace元素
for (int i = 0; i < list2.Count; i++)
{
list2[i] = TestArray[i];
}
}
}
internal class Program
{
static void Main(string[] args)
{
var summary = BenchmarkRunner.Run<FooPerf>();
}
}
}