我猜第二種比第一種慢的原因大概是每次需要一個連續的 A(:,i) 大小的臨時空間用於儲存中間計算結果,之後再將這個結果輸入給 sum 函式;而第一種可能每個元素平方後加到 v 上的,不需要連續的那麼大的臨時空間。你把第一種改成:
我猜第二種比第一種慢的原因大概是每次需要一個連續的 A(:,i) 大小的臨時空間用於儲存中間計算結果,之後再將這個結果輸入給 sum 函式;而第一種可能每個元素平方後加到 v 上的,不需要連續的那麼大的臨時空間。你把第一種改成:
速度會慢很多,而對第二種做類似修改幾乎沒有影響。除此之外的差距可能就是 sum 的 overhead 所致。總之看不到編譯結果只能靠猜了,所以太深究也沒可靠的支援。可能你這個版本知道的到下個版本就不一樣了,況且最近更新了 JIT,還有很多不完善的地方。更新:@立黨,本來想放在評論裡邊的,結果發現有點長了,就更新一下:首先,你這個測試是放在 command window 中執行的吧,這樣會很慢的。建議你放在函式中執行:對比你的測試結果:可以看到兩種都更快了,但是第二種加速非常明顯(我們電腦配置不同應該也不會產生500倍的差距吧,何況第一種並沒有快多少)以至於直接扭轉了對比結果。其次,會不會每次都銷燬這點還不好說,JIT 稍微處理得好一些的話應該就不會在每次迴圈中都做銷燬操作(比方說記憶體足夠時完全可以在函式結束時再銷燬或者一定次數後銷燬),所以“每次都銷燬”這點應該也只是你的猜測,最好說明一下,否則可能會誤導別人。另外,你的第一個例子是想簡化模型來對比,不過簡化的有點過了,第一個例子中 b=sum(A) 並沒有開闢新的空間複製A,只是一個求和(頂多在求和過程中會宣告一些臨時空間用於儲存多執行緒求和的結果,這些臨時空間要比A的小得多),而 A = zeros(7000,1) 只是宣告空間,沒有求和,所以這兩個運算對比體現不出來你想表達的意義題主的例子中之所以我猜測需要複製 A 是因為他用了索引運算,索引運算和直接引用是非常不同的:可以看到第二種方法用了索引(即使是索引了整個 A )之後時間增加非常多;第三組是一個對照,可以看到單索引 A 需要的時間已經超出了 a=sum(A) 需要的全部時間,也就是說 sum(A) 的時候不太可能是先去複製 A通常情況下只有索引結果需要用臨時變數儲存(但似乎題主的第一個例子中處理得更好一些),而如果直接使用整個變數則通常只是引用,即使傳入函式也一樣,除非你在函式內部試圖修改輸入變數MATLAB才會複製一份輸入:不過有種情況例外,就是如果你的輸入和輸出再函式內部以及呼叫的時候都是一樣的,這樣反而會更快一些。這裡就不多說了