我想向你展示这个小的(在这种简化形式毫无意义)的红宝石代码片段,它运行速度非常慢:
MAX = 28123
M = 7000
abundant = Array.new(M) {|k| k}
checked = Array.new(MAX) {|k| false}
for a in 0..M-1 do
for b in a..M-1 do
checked[abundant[a] + abundant[b]] = true if abundant[a] + abundant[b] < MAX
end
end
执行大约需要10秒钟,而等效的C ++代码大约需要0.2秒:
int main()
{
int abundant[M];
bool checked[MAX];
for (int n = 0; n < M; n++)
abundant[n] = n;
for (int n = 0; n < MAX; n++)
checked[n] = false;
for (int a = 0; a < M; a++)
for (int b = a; b < M; b++)
if (abundant[a] + abundant[b] < MAX)
checked[abundant[a] + abundant[b]] = true;
}
我在ruby实现中做错了什么?我是ruby的新手 - 我是否使用任何已知为慢速的语句?
答案 0 :(得分:3)
Ruby肯定比C ++慢很多,所以你没有太多办法可以让你的代码更快。
我相信以下代码具有相同的行为并且速度更快(±25%):
MAX = 28123
M = 7000
checked = Array.new(MAX) {|k| false}
(0..M - 1).each do |a|
(a..M - 1).each do |b|
checked[a + b] = true if a + b < MAX
end
end
使用#each没有任何区别,但可以减少数组访问。我相信C ++的原因之一是因为它不需要边界检查数组访问,而Ruby必须这样做。
您是否可以更改C ++版本以使用std::vector
和.at()
来访问数组,然后与Ruby版本进行比较?