2015-04-29 58 views
2

這個實驗的目標是將Matlab和Julia的速度與下面的一小段代碼進行比較。關於Julia和Matlab之間時序比較的奇怪觀察

首先Matlab代碼:

>> t = 5000; n = 10000; x = 1:t*n; 
>> x = reshape(x, t, n); 
>> tic(); y1 = sum(x(:) .* x(:)); toc() 
Elapsed time is 0.229563 seconds. 
>> y1 

    y1 = 
     4.1667e+22 
>> tic(); y2 = trace(x * x'); toc() 
Elapsed time is 15.332694 seconds. 

>> y2 
y2 = 
     4.1667e+22 

對戰中朱莉婭

julia> t = 5000; n = 10000; x = 1: t*n;  
julia> x = reshape(x, t, n); 
julia> tic(); y1 = sum(x[:].* x[:]); toc(); 
elapsed time: 1.235170533 seconds 
julia> y1 
-4526945843202100544 
julia> tic();y2 = trace(x*x'); toc(); 

第二個沒完成的作業超過1分鐘。那麼朱莉婭怎麼了?這段代碼碰巧在Julia中運行速度較慢且溢出?我的風格有什麼問題嗎?我認爲從Matlab轉換到Julia的一個原因是速度,我曾經認爲Julia默認處理大數運算操作。現在,看起來這些不正確。有人可以解釋嗎?

+4

參見http://docs.julialang.org/en/release-0.3/manual/performance-tips/和http://docs.julialang.org/en/release-0.3/manual/faq/#why- do-julia-use-native-machine-integer-arithmetic –

+0

謝謝Isaiah! – user25004

回答

8

這裏有一些事情正在進行。

首先,與Matlab不同,x是機器整數的數組,而不是浮點值。這似乎是速度的主要區別,因爲它不能使用線性代數的BLAS例程。

你需要做的要麼

x = 1.0:t*n 

或明確通過

x = float(x) 

轉換呢?這也是一個不同的答案的理由:茱莉亞使用機器的運算,這對於整數將環繞在溢出(因此負數)。浮點值不會產生這個問題。

(朱莉婭確實有任意精度的整數,但默認情況下不提倡:相反,你需要通過big(n)自己推廣起來)

這會給你一些速度,但你可以做的更好。 Julia確實需要與Matlab稍微不同的編程風格。請參閱以賽亞在上面評論中提供的鏈接。

在問候你的具體的例子

sum(x[:].* x[:]) 

這是緩慢的,因爲它創造3箇中間載體(的x[:] 2份,但希望這將在未來的改變,他們的產品)。

同樣,

trace(x*x') 

計算中間矩陣(其中大多數在跟蹤未使用)。

我的建議是使用

dot(vec(x),vec(x)) 

vec(x)只是重塑x成向量(所以沒有複製)和dot是平時的積。你也可以「滾你自己」:

function test(x) 
    s = zero(eltype(x)) # this prevents type-instability 
    for xi in x 
     s += xi*xi 
    end 
    s 
end 

test(x) 

(這需要在對JIT編譯器的工作它的神奇功能)。它應該是相當快的,但可能還不如dot,它使用下面的BLAS調用。

+0

這是一個很棒的答案。非常感謝Simon Byrne! – user25004

+2

很好的答案,但我希望你會有你的選擇。 – reschu