C# - 数组索引与LINQ?

时间:2011-01-09 22:20:01

标签: c# arrays linq performance

这些之间的性能差异是什么?

/// 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);

假设data是格式为part1.part2.part3的字符串。

修改

这真的比其他任何东西都更加空闲。我没有破解开放反射器以查看LINQ内部发生的情况,但我不知道它如何比直接数组操作更快。感谢您的提示。

4 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

选项1和2在性能方面是相同的,因为Last扩展方法检查底层enmerable是否有索引器,如果是,它只返回最后一个元素。就选项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

答案 3 :(得分:1)

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

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

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