performance - Strange observation about timing comparison between Julia and Matlab -
the goal of experiment compare speed of matlab , julia small piece of code below.
first matlab code:
>> t = 5000; n = 10000;  x = 1:t*n; >> x = reshape(x, t, n); >> tic(); y1 = sum(x(:) .* x(:)); toc() elapsed time 0.229563 seconds. >> y1      y1 =          4.1667e+22 >> tic(); y2 = trace(x * x'); toc() elapsed time 15.332694 seconds.  >> y2 y2 =        4.1667e+22   versus in julia
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();   the second 1 did not finish job in more 1 minutes. matter here julia? piece of code happen run both slower , overflow in julia? there problem in style? think 1 reason convert matlab julia speed, , used think julia handles big number arithmetic operations default. now, looks these not correct. can explain?
there couple of things going on here.
firstly, unlike matlab, x array of machine integers, not floating point values. appears main difference in speed, unable use blas routines linear algebra.
you need either
x = 1.0:t*n   or explicitly convert via
x = float(x)   this reason different answer: julia uses machine arithmetic, integers wrap around on overflow (hence negative number). won't have problem floating point values.
(julia have arbitrary-precision integers, doesn't promote default: instead need promote them via big(n))
this give speed up, can better. julia require different programming style matlab. see links isaiah provided in comments above.
in regards specific examples
sum(x[:].* x[:])   this slow creates 3 intermediate vectors (2 copies of x[:], though change in future, , product).
similarly,
trace(x*x')   computes intermediate matrix (most of not used in trace).
my suggestion use
dot(vec(x),vec(x))   vec(x) reshapes x vector (so no copying), , dot usual sum-product. "roll-your-own":
function test(x)     s = zero(eltype(x)) # prevents type-instability     xi in x         s += xi*xi     end     s end  test(x)   (this needs in function jit compiler work magic). should reasonably fast, though still not fast dot, uses blas calls underneath.
Comments
Post a Comment