【发布时间】:2015-07-19 19:35:59
【问题描述】:
我按照 Cormen 的“算法简介”中的伪代码在 Ruby 中创建了简单的插入排序实现:
def sort_insert(array)
(1 ... array.length).each do |item_index|
key = array[item_index]
i = item_index - 1
while i >= 0 && array[i] > key do
array[i + 1] = array[i]
i -= 1
end
array[i + 1] = key
end
array
end
它可以工作,但执行速度很慢。对于 ~20k 元素数组 array = ((0..10_000).to_a * 2).shuffle,排序大约需要 20 秒。我只测量这个方法调用的时间,没有数据准备等。在 JavaScript 中,一个非常相似的解决方案大约需要 1 秒。为什么 Ruby (v. 2.2.2p95) 在这里这么慢?
编辑: 这个排序的JS版本,我用的:
function SortMethods() {
}
SortMethods.prototype.sortInsert = function(array) {
for(let itemIndex = 1; itemIndex < array.length; itemIndex++) {
let key = array[itemIndex];
let i = itemIndex - 1;
while( i >= 0 && array[i] > key) {
array[i + 1] = array[i];
i--;
}
array[i + 1] = key;
}
return array;
}
【问题讨论】:
-
在我的笔记本电脑上对 20k 个随机数进行排序大约需要 5.9 秒 (
a = Array.new(20_000) { rand })。无法与 JS 相提并论,因为我不是 JS 程序员,但对于具有 20k 值的 O(N^2) 算法,我发现约 6 秒并不令人震惊。相比之下,使用a.sort!需要 0.01 秒,这对我来说已经足够快了。 -
对我来说,这个问题听起来像,“为什么我的刀不切,如果我倒置使用它”
-
您可以使用ruby-prof 了解 Ruby 是如何花费时间的。但是,不同语言的两种实现之间存在 20 倍的速度差异也就不足为奇了。你甚至没有说正在使用什么 Javascript 实现,所以很难评论差异。
-
我认为所提出的问题基本上是无法回答的,或者至少没有任何有用或有意义的方式。 “为什么 A 与 B 不同?”的正确但无用的答案是“因为 A 和 B 不同。”
-
@HunterStevens 是的,我已经编写了相同算法的 JS 版本,并说我想知道为什么 Ruby 实现与 Javascript 相比要慢得多。我在问题中包含了这两个代码。
标签: ruby performance