【发布时间】:2009-11-13 05:18:58
【问题描述】:
作为学习经验,我最近尝试在 C# 中实现 Quicksort with 3 way partitioning。
除了需要在递归调用之前对左/右变量添加额外的范围检查之外,它似乎工作得很好。
我事先知道框架在 List.Sort 中提供了一个built-in Quicksort implementation(通过 Array.Sort)。所以我尝试了一些基本的分析来比较性能。结果:内置的 List.Sort 方法,对相同的列表进行操作,比我自己手动实现的速度快 10 倍左右。
使用反射器,我发现 List.Sort 中的实际排序是在外部代码中实现的,而不是 IL(在名为 tryszsort() 的函数中)。
看看我自己的快速排序实现,我希望用迭代替换递归调用可能会带来一些改进。此外,禁用数组边界检查(如果可能)也可以带来一些好处。也许这会更接近内置实现,但我没有信心。
所以我的问题是:期望优化算法(用 .NET IL 编写,jitted 本机代码)的性能可以与外部实现算法的性能竞争是否现实?
我再次意识到 Quicksort 是作为框架的一部分提供的,这对我来说只是一次学习经历。然而,还有许多算法(想到 CRC32)没有提供,但对许多应用程序仍然具有很大的价值。这是关于implementing CRC32 in .NET 和性能问题的相关问题。
那么如果您需要在 .NET 中实现这样的算法,需要了解哪些主要的性能注意事项,以便您的算法至少可以接近外部代码的性能?
[更新]
通过将算法更改为对简单的 Int 数组而不是 List 进行操作,我已将执行速度提高到内置 Array.Sort 的 10% 以内。在 Reflector 中,我可以看到这避免了对列表中的每个 get 或 set 执行 Callvirt() 操作。我认为这可能会有所改善,但我对它的效果感到惊讶。
【问题讨论】:
-
我一直认为大多数快速排序实现会在递减预定数量的递归级别后切换到合并排序。您介意发布您的代码以查看需要改进的地方吗?
标签: .net performance algorithm quicksort