- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
这是对这个优秀问题的跟进 C# Sort and OrderBy comparison .我将使用相同的示例:
List<Person> persons = new List<Person>();
persons.Add(new Person("P005", "Janson"));
persons.Add(new Person("P002", "Aravind"));
persons.Add(new Person("P007", "Kazhal"));
争论的方法是:
persons.Sort((p1, p2) => string.Compare(p1.Name, p2.Name, true));
//and
persons.OrderBy(n => n.Name);
首先让我说,我知道没有任何显着的性能差异需要担心。但我很想知道为什么 OrderBy
表现比Sort
好得多.我正在使用@phoog 在原始问题中发布的答案。
private void button1_Click(object sender, EventArgs e)
{
IEnumerable<Person> people;
BenchMark(persons => persons.Sort((p1, p2) => string.Compare(p1.Name, p2.Name, true)));
BenchMark(persons => people = persons.OrderBy(n => n.Name));
}
private static Random randomSeed = new Random();
public static string RandomString(int size, bool lowerCase)
{
var sb = new StringBuilder(size);
int start = (lowerCase) ? 97 : 65;
for (int i = 0; i < size; i++)
{
sb.Append((char)(26 * randomSeed.NextDouble() + start));
}
return sb.ToString();
}
private static void BenchMark(Action<List<Person>> action)
{
List<Person> persons = new List<Person>();
for (int i = 0; i < 10000; i++)
{
persons.Add(new Person("P" + i.ToString(), RandomString(5, true)));
}
List<Person> unsortedPersons = new List<Person>(persons);
Stopwatch watch = new Stopwatch();
for (int i = 0; i < 100; i++)
{
watch.Start();
action(persons);
watch.Stop();
persons.Clear();
persons.AddRange(unsortedPersons);
}
MessageBox.Show(watch.Elapsed.TotalMilliseconds.ToString());
}
结果:
Sort() => 3500 ~ 5000 ms
OrderBy() => 0.2 ~ 1.5 ms
尽管我最初测试的列表较小时差异也很大,但一旦集合的大小增加,差异就会变得越来越明显。可能是我遗漏了一些理解 .NET 集合的关键,但我的想法是因为 Sort
作用于现有的 List<T>
,与 OrderBy
相比,它在处理过程中的开销(如果有的话)应该更小它作用于相同的 List<T>
(在我们的例子中是 persons
)但必须返回另一个集合 IOrderedEnumerable<T>
.但还是OrderBy
表现要好得多。 List<T>
与 IEnumerable<T>
相比可能会有一定的开销类型,但是 Sort
无论如何都对现有列表起作用!此外,我很高兴看到 Linq
方法比现有的 .NET 方法工作得更快。
原题所有答案对比Sort
反对OrderBy.ToList
我相信这会有一些开销,因此或多或少地表现相同。
实现差异可能是什么?
编辑: 好的,我学到了一些新东西。这是我确认延迟执行的方式。
private void button1_Click(object sender, EventArgs e)
{
BenchMark(persons =>
{
persons.Sort((p1, p2) => string.Compare(p1.Name, p2.Name, true));
foreach (var item in persons)
{
break;
}
});
BenchMark(persons =>
{
IEnumerable<Person> people = persons.OrderBy(n => n.Name);
foreach (var item in people)
{
break;
}
});
}
Sort
在 4000 - 5000 毫秒内运行 OrderBy
运行刚好超过 5000 毫秒。所以我的结论确实是错误的。一旦我开始列举这些收藏品,他们俩的表现就差不多了。我更喜欢 OrderBy
的语法任何时候:)
编辑 2: 我刚刚发现这与 this one 完全相同.但这里有一个 more interesting question about deferred execution in general虽然不是完全订购。
最佳答案
在这种情况下,OrderBy
速度要快得多,因为您实际上并没有执行它。
在您枚举结果之前,查询是延迟的,因此它从未实际进行排序。在您实际枚举结果之前,IOrderedEnumerable<T>
不处理输入并进行任何形式的排序。
尝试将基准更改为:
BenchMark(persons => people = persons.OrderBy(n => n.Name).Count());
Count()
调用将强制实际发生排序(因为它需要枚举 IOrderedEnumerable<T>
来生成计数),这应该会显着平衡您的时间。
大多数 LINQ 扩展方法都是这样工作的——直到您枚举它们(通过 Count()
、调用 ToList()
或只是在普通的 foreach
循环中使用它们,等等),它们的影响可以忽略不计,因为它们不' 实际上直接做任何事情,而不是构建可枚举的。其他基准与 OrderBy(...).ToList()
比较的原因是添加ToList()
强制 OrderBy
完全执行并实际排序结果。
关于c# - 为什么返回 IOrderedEnumerable<T> 的 OrderBy 比 Sort 快得多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13181498/
我在玩一些代码挑战时发现自定义排序(排序接口(interface)的实现)比仅针对 slice 的原始结构要快得多。这是为什么?将 slice 转换为类型是否会产生一些魔力(例如转换为指向结构的指针
我正在使用 simple-import-sort eslint 插件进行 react 。我想我的 .eslintrc.js是对的,但我无法使这个特定的插件工作。我在文件的第一行收到以下错误: 未找到规
Closed. This question is not reproducible or was caused by typos。它当前不接受答案。 想改善这个问题吗?更新问题,以便将其作为on-to
好的,所以我是 Go 的新手,我正在努力让自己熟悉按函数排序。我可能误解了什么,所以如果我错了请纠正我。 我正在尝试创建一个包含字段 key 和 value 的 Nodes 数组。我想创建一个自定义排
我想从惰性列表中取出 n 个最大的元素。 我听说在 Data.List.sort 中实现的合并排序是惰性的,它不会产生不必要的元素。就比较而言,这可能是正确的,但在内存使用方面肯定不是这样。下面的程序
这个问题已经有答案了: Javascript sort function. Sort by First then by Second (10 个回答) 已关闭 3 年前。 我正在尝试返回已排序产品的列
我有一个 vector 对,如下所示。第一对值未排序,第二对值已排序(从零开始)。我可能想通过实现 std::vector 和 std::pair 来存储数据。当我有第一对值(未排序)时,找到相应的第
直到现在(Swift 2.2)我一直愉快地使用来自 this answer 的代码- 它迅速,优雅,它像梦一样工作。 extension MutableCollectionType where Ind
我在我的 Go 应用程序中实现排序界面时遇到问题。这是相关代码: type Group struct { Teams []*Team } type Team struct { Point
我很好奇 Lua 的默认算法是什么 table.sort使用,只是因为它比我遇到的其他一些排序算法慢。我也很好奇 Lua 的 table.sort是在引擎中用 C 编写的,或者如果它在 Lua 中的库
例如,插入排序被描述为部分排序数组的有效算法。但如何精确定义“部分排序”呢? 最佳答案 这是一个只有少数元素不合适的数组。如果没有指定百分比或其他阈值,则部分排序和未排序之间没有严格的区别。 正式定义
我是 GPU 编程的新手。最近,我正在尝试根据一个教程实现gpu bvh构建算法:http://devblogs.nvidia.com/parallelforall/thinking-parallel
有人可以指导我 Gnumeric 排序函数的详细说明(链接)吗? Gnumeric 手册很简短并且没有示例。我无法通过搜索引擎找到任何合适的信息,甚至 Stackoverflow 上也只有六个不合适的
在 Python 中使用什么精确规则来对列表进行排序,其中元素是列表?这可以表示为“key”或“cmp”吗功能?问题来自于有两件事考虑:长度和它们位置的值。 sorted([ [ 0, 1, 2
下面的代码应该创建一个整数数组 (a) 并对它进行排序,但是 sort.Sort 似乎没有修改变量。 package main import ( "fmt" "sort" ) type
我有一个应用于结构的自定义排序函数。完整代码是 here on play.golang.org . type Stmt struct { Name string After []st
python3 sorted取消了对cmp的支持。 python3 帮助文档: ?
以下是来自普林斯顿的 coursera 算法类(class)的练习。 如果一个数组既是 3 次排序又是 5 次排序,那么它是否也是 6 次、7 次、8 次、9 次和 10 次排序?我知道任何序列如果先
当我看到上面的语句时,我正在阅读 shell-sorting。这意味着什么?它对我看待 shell 排序的方式有何不同? PS:我不是在寻找声明的证据。 最佳答案 好吧,你可能暗示下一个排序阶段不会“
今天在检查mysql服务器的时候提示Sort aborted: Out of sort memory, consider increasing server sort buffer size,安装字
我是一名优秀的程序员,十分优秀!