【问题标题】:C# - array index vs LINQ?C# - 数组索引与 LINQ?
【发布时间】:2011-01-09 22:20:00
【问题描述】:

如果有的话,它们之间的性能差异是什么?

/// option 1
string result = data.Split('.').Last<string>();


/// option 2
string[] parts = data.Split('.');
string result = data[data.Length-1];

/// option 3
string result = data.Substring(data.LastIndexOf('.')+1);

假设datapart1.part2.part3格式的字符串。

编辑

这真的是比什么都更无聊的好奇心。我还没有破解开放式反射器来查看 LINQ 内部发生了什么,但我看不出它如何比直接数组操作更快。感谢您的提示。

【问题讨论】:

  • 您在选项 3) 中遗漏了一些东西(data.Substring ?)

标签: c# arrays linq performance


【解决方案1】:

如果您真的在乎,请测量它。

我猜选项 3) 比其他 2 快一点。
但这只是猜测。

【讨论】:

    【解决方案2】:
    void Main()
    {
        var tester = new testing();
        var runTimeOne = tester.optionOne();
        runTimeOne.Dump();
        var runTimeTwo = tester.optionTwo();
        runTimeTwo.Dump();
        var runTimeThree = tester.optionThree();
        runTimeThree.Dump();
    }
    public class testing
    {
        public String dataString = "part1.part2.part3";
        public int numRuns = 1000000;
    
        public TimeSpan optionOne()
        {
            var startTime = DateTime.Now;
    
            for(var i = 0; i < numRuns; i++)
            {
                string result = dataString.Split('.').Last<string>();
            }
            return (DateTime.Now - startTime);
        }
    
        public TimeSpan optionTwo()
        {
            var startTime = DateTime.Now;
    
            for(var i = 0; i < numRuns; i++)
            {
                string[] parts = dataString.Split('.');
                string result = parts[parts.Length-1];
    
            }
            return (DateTime.Now - startTime);
        }
        public TimeSpan optionThree()
        {
            var startTime = DateTime.Now;
    
            for(var i = 0; i < numRuns; i++)
            {
                string result = dataString.Substring(dataString.LastIndexOf('.')+1);
            }
            return (DateTime.Now - startTime);
        }
    }
    

    结果:

    00:00:00.9660552

    00:00:00.2010115

    00:00:00.0360021

    【讨论】:

    • 没想到 1 和 2 之间的差异如此之大。请注意,对于长字符串,1 和 2 之间的差异保持不变,但 2 和 3 之间的差异会增大。
    【解决方案3】:

    选项 1 和 2 在性能方面是相同的,因为 Last 扩展方法检查底层 enmerable 是否有索引器,如果有,它只返回最后一个元素。就选项 3 而言,您需要与其他两个进行测量,但我怀疑差异可以忽略不计。

    【讨论】:

    • 你的推理不支持你的结论。如果选项 1 做了一些工作(检查是否存在索引器),然后执行选项 2,那么选项 1 很可能比选项 2 慢。
    【解决方案4】:

    对于小字符串,差异会很小,但对于大字符串,第三种选择显然更有效。

    前两个选项将扫描整个字符串并将其复制到新字符串中并创建一个字符串数组。第三个选项将只从末尾扫描字符串以查找句点,然后创建一个需要的字符串。

    因此,对于特定用途,您将衡量哪种方法对您拥有的特定数据最有效,但对于一般用途,第三个选项是最好的,因为它可以更好地扩展。

    【讨论】:

      猜你喜欢
      • 2010-10-28
      • 2019-03-22
      • 2016-07-26
      • 1970-01-01
      • 2012-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-29
      相关资源
      最近更新 更多