Nat*_*teJ 2 .net c# sorting performance
语言细节:C#.NET 3.5/4.0; project是一个预编译的DLL,是其他产品调用/使用的"模块".
我的问题是关于整体效率,我意识到这可能归结为"内存使用与CPU周期"的决定,这很好 - 我仍然想知道你认为哪条路线更好.
我有一个传递给方法的MyObjects列表,该方法需要按Property2对List进行排序,用它做"一些东西",然后按Property1对List进行排序以做"其他事情"并继续生活.重要提示:当Property1首次进入方法时(例如,从数据层), List1 已经按照它排序.
排序将是"自定义内联",如下所示:
myList.Sort((ObjA, ObjB) => ObjA.Prop2.CompareTo(ObjB.Prop2));
Run Code Online (Sandbox Code Playgroud)
做这两种排序是个好主意吗?或者,将列表克隆到新的ListB并且仅调用Sort一次(在ListB上,由Prop2调用)会更好吗?然后用它做"一些东西",完成后,使用原始列表中的"其他东西"并继续.
我最初的猜测是"Two Sorts"会旋转更多的CPU周期,而"Clone&Sort"会使用更多的内存(因为它必须创建新的ListB对象) - 是的我知道列表成员(MyObjects)会不被克隆,他们只是被新的ListB指向.
思考?
创建一个新操作List<T>将是一个O(n)操作,因为每个项目将被复制到新列表中. List<T>.Sort是典型的 O(n log n).
因此,排序两次会更慢.复制将需要您的列表副本.这是记忆与速度的关系.
话虽这么说,复制不会改变原始列表的排序顺序 - 在我看来,这是一个很大的优势,因为将列表传递给某个方法并让它返回更改通常会成为后来的错误来源,就像人们一样不一定期望一种方法来改变你的订单.当您的列表已经排序时尤其如此- 如果您遇到创建有序列表的麻烦,我建议尽可能避免更改该顺序.
但是,根据你正在做的事情,你可以使用Enumerable.OrderBy按顺序拉出第二组,并做你的"东西".这也具有与副本相同的优点,因为它不会改变原始列表的顺序.
| 归档时间: |
|
| 查看次数: |
408 次 |
| 最近记录: |