排序算法效率
Posted
技术标签:
【中文标题】排序算法效率【英文标题】:Sorting Algorithm Efficiency [closed] 【发布时间】:2015-02-22 03:55:22 【问题描述】:我想问一个一般性问题。
我正在比较 C、Java 和 Haskell 上排序的运行时间。哪种语言,提供相同级别的优化(当然认为可能会有所不同)应该具有最快的运行时间,而哪种语言最慢(理论上)? 他们都将阅读相同的文本文件并按字母顺序对单词进行排序。 如果我能得到深入的解释,那就太好了,非常感谢。
谢谢~
【问题讨论】:
【参考方案1】:对此没有“理论上的”答案。没有可靠的“理论”可以让您做出准确的预测。
此外,对程序语言性能进行“理论”比较的整个想法是荒谬的。性能比较是关于使用实际(非理论)编译器编译的实际(非理论)程序,该编译器在实际(非理论)机器上运行实际(非理论)数据集。
如果您要求根据典型应用程序、典型编译器、同等水平的程序员技能以及所需的尽可能多的程序员时间进行“经验法则”猜测,那么:
C 可能是最快的 Java 的速度大概是 C 的 1/3 到 1 倍 Haskell 的速度可能是 Java 的 1/2 到 1 倍。(基于“基准游戏”网站截至 2015 年 2 月 22 日所说的话。)
但是 ...这对于某些应用程序可能会有所不同,这在很大程度上取决于编译器的成熟度和程序员在各自语言中的技能。
此外 ...一个成熟的软件工程师/项目经理不会只为一个项目选择编程语言,该语言可以提供最快的结果。其他因素通常比原始速度更重要。
【讨论】:
根据基准游戏,Haskell 在性能方面通常与 java 相当。 benchmarksgame.alioth.debian.org/u64q/… @gxtaillon - 我将其读取为速度的 1/2 到 1 倍。但无论如何我已经更新了我的答案。谢谢。 这在很大程度上取决于程序员的技能以及他们选择的技术。完全有可能在 Haskell 中编写一个排序未装箱的可变向量的过程,其速度与 C 中最好的一样快。但是,大多数 Haskell 程序员不喜欢编写这种代码,也不要'反正也没多大用处。【参考方案2】:理论上,它们都将执行相同的算法,因此您实际上只是在处理不同语言实现的变幻莫测,这是一个实际问题——而不是理论问题。
回答您的实际问题的唯一方法是选择具体的实现(语言、编译器、体系结构、程序、输入等),然后对它们进行全面的基准测试。
【讨论】:
【参考方案3】:引用@coobird's的答案,
C 没有什么特别之处。这就是它速度快的原因之一。
支持garbage collection 的较新语言, dynamic typing 和其他便利设施 程序员编写程序。
问题是,会有额外的处理开销 降低应用程序的性能。 C 没有 那,这意味着没有开销,但这意味着 程序员需要能够分配内存并将它们释放到 防止memory leaks,并且必须处理静态类型的 变量。
也就是说,许多语言和平台,例如 Java(及其 Java 虚拟机)和 .NET(及其公共语言运行时)具有 多年来,随着 just-in-time compilation 的出现提高了性能,它产生了从字节码到 获得更高的性能。
【讨论】:
是的......但是正确实现的快速排序(例如在 Java 中)不太可能需要垃圾收集或动态类型。以上是关于排序算法效率的主要内容,如果未能解决你的问题,请参考以下文章