c# - 为什么在此示例中使用 Tuple 比使用 List 更快?

标签 c# list tuples

我写了一个 C# 类,它用一些数据填充“ double 列表列表”(不管数据是什么,现在它可能只是一些垃圾:)),用于测试目的:

代码如下:

    class test
    {
    public test()
    {
       _myListOfList = new List<List<double>>(1000000);
    }
    public void Run()
    {
        for (int i = 0; i < _myListOfList.Capacity; i++)
        {
            _myListOfList.Add(
                new List<double>(3) { i, 10*i, 100*i}
                ); //Populate the list with data
        }
    }

    private List<List<double>> _myListOfList;
}

我将此代码的执行速度与以下代码进行了比较:(用元组替换 double 列表)

    class test
    {
    public test()
    {
       _myListOfTuple = new List<Tuple<double, double, double>>(1000000);
    }
    public void Run()
    {
        for (int i = 0; i < _myListOfTuple.Capacity; i++)
        {
            _myListOfTuple.Add(
                new Tuple<double, double, double>(i, 10 * i, 100 * i)
                ); //Populate the list with data
        }
    }

    private List<Tuple<double, double, double>> _myListOfTuple;
}

事实证明,使用 Tuple 似乎要快得多。我针对不同的列表大小(从 200,000 个元素 -> 列表中的 500 万个元素)运行这段代码,这是我得到的结果:

graph

我真的无法理解这个问题。我怎么会得到如此显着的差异?使用存储相同类型对象(此处为双倍)的元组没有多大意义。我宁愿使用列表/数组来做到这一点:我做错了什么?有没有办法让案例 #1 的运行速度与案例 #2 一样快/更快?

谢谢!

最佳答案

new Tuple<double, double, double>(i, 10 * i, 100 * i)之间是有区别的和 new List<double>(3) { i, 10*i, 100*i} .

第一个非常简单 - 只需 3 个作业:

public Tuple(T1 item1, T2 item2, T3 item3) {
    m_Item1 = item1;
    m_Item2 = item2;
    m_Item3 = item3;
}

第二个实际上被编译器转化为3 Add方法调用:

var temp = new List<double>(3);
temp.Add(i);
temp.Add(10 * i);
temp.Add(100 * i);

Add不仅仅是一项任务:

public void Add(T item) {
    if (_size == _items.Length) EnsureCapacity(_size + 1);
    _items[_size++] = item;
    _version++;
}

要运行的代码越多,执行速度越慢。很简单..

关于c# - 为什么在此示例中使用 Tuple 比使用 List 更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38487336/

相关文章:

c# - 无法获取 div_images 的内部内容,因为内容不是文字

Python-尝试为循环内的列表项分配值时列表分配索引超出范围

python - 用于同时过滤和转换的列表理解中的中间变量

python - 在for循环python中打印元组

c++ - 命名空间标准重载小于

C# 反射 : How to invoke a EventInfo?

c# - 使用 OpenXML 合并 PowerPoint 幻灯片

python - 元组列表中元组的第一个元素小写

c# - 命名异步 lambda 函数

Ruby 枚举器链接