首页 > 解决方案 > 如何找出为什么特定排序较慢

问题描述

我试图找出哪个更快,OrderByDescending()或者Sort()然后Reverse(). 为了找出答案,我在 LINQPad 中编写了一个简单的测试。显然我可以看看我的数字来找出哪个更快,但如果可能的话,我想知道为什么。引擎盖下发生了什么使OrderByDescending()速度变慢?

我可以猜测,但我如何确定。另外,作为后续,我的结果准确吗?跑步时我的差距很大。OrderByDescending()当前正在显示(每次运行都会略有变化)

平均:2.927742 | 最小:2 | 最大:7934

排序然后反向

平均:0.870451 | 最小:0 | 最大:526

为了使平均值如此接近最小值,那么百万操作中的大部分必须接近它。如果我进入每个前 100 名,那么我会看到很多偏高的地方。我是否缺少某种优化?

总体而言,如何找出效率的原因(并解决数据中的不规则性)而不是仅仅分析它以找出两者之间哪个更快?

var sw = new Stopwatch();
var times = new List<long>();
for (var i = 0; i < 1000000; i++)
{
    var foo = new List<Version>
    {
        new Version("2.0.0.0"),
        new Version("1.0.0.0"),
        new Version("2.0.0.0")
    };
    sw.Start();
    var bar = foo.OrderByDescending(f => f).ToList();
    sw.Stop();
    times.Add(sw.ElapsedTicks);
    sw.Reset();
    foo = null;
    bar = null;
}
"OrderByDescending times:".Dump();
times.Average().Dump();
times.Min().Dump();
times.Max().Dump();

var sw1 = new Stopwatch();
var times1 = new List<long>();
for (var i = 0; i < 1000000; i++)
{
    var foo = new List<Version>
    {
        new Version("2.0.0.0"),
        new Version("1.0.0.0"),
        new Version("2.0.0.0")
    };
    sw1.Start();
    foo.Sort();
    foo.Reverse();
    sw1.Stop();
    times1.Add(sw1.ElapsedTicks);
    sw1.Reset();
    foo = null;
}
"Sort then Reverse times:".Dump();
times1.Average().Dump();
times1.Min().Dump();
times1.Max().Dump();

times.OrderByDescending(t => t).Take(100).Dump();
times1.OrderByDescending(t => t).Take(100).Dump();

标签: c#performancelinq

解决方案


推荐阅读