C#-数组索引与LINQ?

C#-数组索引与LINQ?,c#,arrays,linq,performance,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); ///选项1

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

/// 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);
///选项1
字符串结果=data.Split('.').Last();
///选择2
string[]parts=data.Split('.');
字符串结果=数据[data.Length-1];
///选择3
字符串结果=data.Substring(data.LastIndexOf('.')+1);
假设
data
是格式为
part1.part2.part3
的字符串

编辑


这真的是比其他任何事情都更无聊的好奇心。我还没有打开反射器来查看LINQ内部发生了什么,但我不知道它怎么会比直接阵列操作更快。谢谢你的提示。

如果你真的在乎,请测量一下

我猜选项3)比其他2)快一点。

但这只是一个猜测。

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

我猜选项3)比其他2)快一点。

但这只是一个猜测。

选项1和选项2在性能方面是相同的,因为最后一个扩展方法检查基础enmerable是否有索引器,如果有,则只返回最后一个元素。就选项3而言,您需要用另外两个来衡量它,但我怀疑会有一个微不足道的差异。

选项1和2在性能方面是相同的,因为最后一个扩展方法检查基础enmerable是否有索引器,如果有索引器,它只返回最后一个元素。就选项3而言,您需要用另外两个来测量它,但我怀疑会有一个微不足道的差异。

void Main()
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);
    }
}
{ var测试仪=新测试(); var runTimeOne=tester.optionOne(); runTimeOne.Dump(); var runTimeTwo=tester.optionTwo(); runTimeTwo.Dump(); var runTimeThree=tester.optionTree(); runTimeThree.Dump(); } 公共类测试 { 公共字符串dataString=“part1.part2.part3”; 公共整数numRuns=1000000; 公共TimeSpan optionOne() { var startTime=DateTime.Now; 对于(变量i=0;i
结果:

00:00:00.9660552

00:00:00.2010115

00:00:00.0360021

void Main()
{
var测试仪=新测试();
var runTimeOne=tester.optionOne();
runTimeOne.Dump();
var runTimeTwo=tester.optionTwo();
runTimeTwo.Dump();
var runTimeThree=tester.optionTree();
runTimeThree.Dump();
}
公共类测试
{
公共字符串dataString=“part1.part2.part3”;
公共整数numRuns=1000000;
公共TimeSpan optionOne()
{
var startTime=DateTime.Now;
对于(变量i=0;i
结果:

00:00:00.9660552

00:00:00.2010115


00:00:00.0360021

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

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


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

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

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


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

在选项3中,您缺少了一些东西(data.Substring?)您缺少了一些东西(data.Substring?)在选项3)中,您的推理不支持您的结论。如果选项1做了一些工作(检查是否存在索引器),然后又做了选项2,那么很可能选项1比选项2慢。您的推理不支持您的结论。如果选项1做了一些工作(检查是否存在索引器),然后又做了选项2,那么最有可能的是选项1比选项2慢。不会想到1和2之间的差异会那么大。请注意,对于长字符串,1和2之间的差异保持不变,但2和3之间的差异会增大。这是意料不到的