在ruby中缓慢访问数组?

时间:2014-08-27 10:53:08

标签: ruby arrays ruby-1.9.3

我想向你展示这个小的(在这种简化形式毫无意义)的红宝石代码片段,它运行速度非常慢:

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的新手 - 我是否使用任何已知为慢速的语句?

1 个答案:

答案 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版本进行比较?