我想目前你這個小(在這種還原形式無謂)的紅寶石代碼,運行非常緩慢片段:紅寶石緩存數組訪問?
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;
}
我在做錯誤的紅寶石實現?我是新來的紅寶石 - 我使用任何已知是慢的聲明?
對我來說運行<3s,包括Ruby旋轉起來。在任何情況下,(a)解釋,(b)有對象創建,(c)你正在運行一個塊來初始化這些對象,等等。蘋果,桔子。 – 2014-08-27 10:58:37
但是對於這樣一個簡單的任務,0.2s vs. 3s仍然不是真的可以接受的。數組的創建不是關鍵點(添加'puts'init done「'消息時很容易看到),它是嵌套的循環,它會產生變化。 「有對象創造」是什麼意思?循環中是否有這樣的內容? – JulianS 2014-08-27 11:09:13
是的,但是C會允許你這麼做:'abundant = Array.new(2 * M-1,true)+ Array.new(MAX-2 * M-1,false)'?通常,在Ruby中,通過使用已經在C中實現並優化的內置方法(或由gems提供的方法),您可以快速且簡潔地執行操作。 – 2014-08-27 16:08:38