c# - 如何找出为什么特定排序较慢
问题描述
我试图找出哪个更快,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();
解决方案
推荐阅读
- javascript - 为什么 iPhone 显示正确的图像方向而桌面却没有?
- php - 特定端点在升级后的最新 Joomla 上除了默认一种 (en) 以外的所有语言都不起作用 (404)
- python - 将高度数据从 CSV 文件转换为 IMG
- php - 我怎样才能让 gmail smtp 服务器再次工作?
- owl - Protege:等效类定义问题
- apache2 - 访问 apache 2.4 上的服务器信息时出现禁止 (403) 错误
- angular8 - 根据从 Angular 8 的下拉菜单中选择的选项更改对话框的内容
- php - 网站用户输入帖子到我电脑中的文件
- android - 如何在 TextView 中进行更改,同时在 EditView 中进行更改/写入?
- python - 如何在 Python Flask 中同时返回 html 模板和字符串