C# 什么表现更好。拆分一次还是多次?

C# 什么表现更好。拆分一次还是多次?,c#,C#,那么,什么是更好的性能呢 var wholeStr = "Hello, I am\n a Cat.\n You like cats?; var str1 = wholeStr.Split('\n')[0]; var str2 = wholeStr.Split('\n')[1]; var str3 = wholeStr.Split('\n')[2]; 或 我真的不确定,这就是问题所在。您甚至不需要测试就可以知道答案,因为重新调用一个方法在逻辑上比调用一次并处理结果(这是正确的用法)要“慢” 无

那么,什么是更好的性能呢

var wholeStr = "Hello, I am\n a Cat.\n You like cats?;

var str1 = wholeStr.Split('\n')[0];
var str2 = wholeStr.Split('\n')[1];
var str3 = wholeStr.Split('\n')[2];


我真的不确定,这就是问题所在。

您甚至不需要测试就可以知道答案,因为重新调用一个方法在逻辑上比调用一次并处理结果(这是正确的用法)要“慢”

无论如何,我写了一些代码来给你一个技术性的答案

static void PerformAction(string name, int n, Action action)
{
    // Warm up
    action();

    List<double> times = new List<double>();

    for (int i = 0; i < n; i++)
    {
        var sw = Stopwatch.StartNew();
        action();
        times.Add(sw.Elapsed.TotalMilliseconds);
    }

    Console.WriteLine("{0}: MIN: {1}, AVG: {2}, MAX: {3}", name, times.Min(), times.Average(), times.Max());
}
结果:

Multiple splits: MIN: 0, AVG: 0,000537730000000083, MAX: 0,3103
Single split: MIN: 0, AVG: 0,000163129999999993, MAX: 0,4506

由于AVG结果,您可以看到差异。

请参阅。但在你的情况下,肯定是B。你在问做一次手术是否比做三次手术快?你认为哪一次做得更多?然而,唯一真正的方法是测量它(作为发布版本),因为有时候编写编译器的人知道更快的方法来做一些事情。我想到了内存等等。当为split()声明一个自己的数组时,我认为这可能比直接赋值更划算这将只对3个变量执行。发布前没有研究吗?至少你可以试着用秒表来检查哪一个更好。你没有输入性能测试的代码。是的,你能同时粘贴其他代码吗?将来肯定会使用这个方法。我的错,方法性能的代码已经添加。谁在乎最小值和最大值,你只想要平均值。你会看到你的零不是很精确(我们人类知道它不是瞬时的),因此也会扭曲你的平均值。这可能与系统时钟的精度有关。最好在循环前启动秒表,循环后停止,然后取平均值。当然,所有这些都是假设您在调试器之外的发布模式下运行,并且由于str变量没有用于任何用途,所以它没有全部优化?Min和Max在某些情况下是有用的,也许这不是其中之一,但我的方法并不具体,我也将其用于其他目的。用户要求回答,我提供了一个答案,不管它是否无用(每个人都知道这种“优化”是无用的)。
var wholeStr = "Hello, I am\n a Cat.\n You like cats?";

PerformAction("Multiple splits", 10000, () =>
{
    var str1 = wholeStr.Split('\n')[0];
    var str2 = wholeStr.Split('\n')[1];
    var str3 = wholeStr.Split('\n')[2];
});

PerformAction("Single split", 10000, () =>
{
    var strArray = wholeStr.Split('\n');
    var str1 = strArray[0];
    var str2 = strArray[1];
    var str3 = strArray[2];
});
Multiple splits: MIN: 0, AVG: 0,000537730000000083, MAX: 0,3103
Single split: MIN: 0, AVG: 0,000163129999999993, MAX: 0,4506