【发布时间】:2015-08-09 07:32:12
【问题描述】:
我在 irb 中使用 Ruby 的 Benchmark 类,我注意到 Ruby 在迭代时明显变慢了。
我在没有使用 Benchmark 或 Profiler__ 类的情况下做了一个简单的测试(我认为它可能会减慢它的速度)。
def average_test
total_time = 0
time = 0
TESTS.times do |count|
time = test
total_time = total_time + time
yield count, time
end
average = total_time / TESTS
yield 'average', average
end
def test
x = 0
start_time = Time.now
for i in 1..ITERATIONS
x = x + 1
end
end_time = Time.now
time = end_time - start_time
end
ITERATIONS = 10_000_000
TESTS = 20
# create results file
results = File.new('results.txt', 'w')
# start test
average_test {|count, time| results.print "Test #{count}: #{time}"}
results.close
这是在 irb 中运行后的结果。 (以秒为单位,抱歉)
测试 0:2.390647,测试 1:2.343761,测试 2:2.312554,测试 3:2.566792,测试 4:2.665193,测试 5:2.537908,测试 6:2.643086,测试 7:2.534492,测试 8,测试 8:2.5893 :2.390633,测试10:2.539533,测试11:2.385508,测试12:2.49659,测试13:2.498958,测试14:2.527309,测试15:2.462983,测试16:2.504546,测试17:2.570159,2.570159,测试18:2.37144: :2.330072,
测试平均值:2.48306025(s), 2483(ms)
我也在 JavaScript 中做了同样的测试,只是为了比较速度。
function test() {
var start = Date.now();
var x = 0;
for (var i = 0; i < ITERATIONS; i++) {
x = x + 1;
}
var end = Date.now();
var dt = end - start;
return dt;
}
function averageTest() {
var total = 0;
for (var i = 0; i < TESTS; i++) {
var time = test();
total = total + time;
console.log('Test ' + i + ': ', time);
}
var avg = total / TESTS;
console.log('Average: ', avg);
return avg;
}
var ITERATIONS = 10000000;
var TESTS = 20;
// start test
var avgTime = averageTest(); // results
以下是在 Chrome 中运行的 JavaScript 代码的结果。 (以毫秒为单位)
测试 0:41,测试 1:44,测试 2:41,测试 3:48,测试 4:46,测试 5:48,测试 6:49,测试 7:47,测试 8:46,测试 9 : 50, 测试 10: 41, 测试 11: 41, 测试 12: 47, 测试13:54,测试14:55,测试15:57,测试16:35,测试17:50,测试18:47, 测试 19:49,
平均:46.8(毫秒),0.0468(秒)
Ruby 平均为 2483 毫秒,而 JavaScript 为 46.8 毫秒。
为什么会有这么大的差异?是因为Ruby的运算符是方法调用而方法调用很慢还是什么?
我觉得我做错了什么。谢谢。
【问题讨论】:
-
ruby 代码和 javascript 代码没有做同样的事情,你是从 ruby 中产生的(这就是它更慢的原因),你没有将回调函数传递给 javascript 代码(这是为什么它更快),所以你在这里比较苹果和橘子
-
@bjhaid 我只在 average_test 方法中屈服,而不是在 test 方法中。测试方法是对一千万次迭代进行计时的地方。我什至使用了一个没有块的 for..in 循环。
-
如果我只比较
test方法,Chrome 在我的机器上运行速度非常快,只有 18 毫秒,但 Firefox 大约需要 1300 毫秒(两者都在浏览器控制台中运行)。 Ruby 大约需要 720 毫秒。可能是 Chrome 的 JIT 编译器在这种类型的循环中做得很好。 -
@Genos 您正在两种解决方案中的任何一种中调用测试
-
我从 Ruby 获得 0.47767336060000004s,从 Chrome 获得 15.45ms,从 Firefox 获得 1217.6ms。在这种情况下,Chrome 似乎确实在发挥作用。你也在用windows吗?
标签: javascript ruby unit-testing testing