Hello, Other people have already given advice on how to speed up the code. I just want to comment that Julia really is faster than Matlab, but the way that you make code faster in Julia is almost the opposite of how you do it in Matlab. Specifically, in Matlab the advice is that if you want the code to be fast, you need to eliminate every loop you can and write vectorized code instead. This is because Matlab loops are slow. But Julia loops are fast, and vectorized code creates a lot of overhead in the form of temporary variables, garbage collection, and extra loops. So in Julia you optimize code by putting everything into loops. The upshot is that if you take a Matlab-optimized program and just do a direct line-by-line conversion to Julia, the Julia version can easily be slower. But by the same token, if you took a Julia-optimized program and converted it line-by-line to Matlab, the Matlab version would be ridiculously slow.
Oh, and in Julia you also care about types. If the compiler can infer correctly the types of your variables it will write more optimal code. Cheers, Daniel. On Sunday, 18 October 2015 13:17:50 UTC+2, Vishnu Raj wrote: > > Although Julia homepage shows using Julia over Matlab gains more in > performance, my experience is quite opposite. > I was trying to simulate channel evolution using Jakes Model for wireless > communication system. > > Matlab code is: > function [ h, tf ] = Jakes_Flat( fd, Ts, Ns, t0, E0, phi_N ) > %JAKES_FLAT > % Inputs: > % fd, Ts, Ns : Doppler frequency, sampling time, number of samples > % t0, E0 : initial time, channel power > % phi_N : initial phase of the maximum Doppler frequeny > % sinusoid > % > % Outputs: > % h, tf : complex fading vector, current time > > if nargin < 6, phi_N = 0; end > if nargin < 5, E0 = 1; end > if nargin < 4, t0 = 0; end > > N0 = 8; % As suggested by Jakes > N = 4*N0 + 2; % an accurate approximation > wd = 2*pi*fd; % Maximum Doppler frequency[rad] > t = t0 + [0:Ns-1]*Ts; % Time vector > tf = t(end) + Ts; % Final time > coswt = [ sqrt(2)*cos(wd*t); 2*cos(wd*cos(2*pi/N*[1:N0]')*t) ]; > h = E0/sqrt(2*N0+1)*exp(j*[phi_N pi/(N0+1)*[1:N0]])*coswt; > end > Enter code here... > > My call results in : > >> tic; Jakes_Flat( 926, 1E-6, 50000, 0, 1, 0 ); toc > Elapsed time is 0.008357 seconds. > > > My corresponding Julia code is > function Jakes_Flat( fd, Ts, Ns, t0 = 0, E0 = 1, phi_N = 0 ) > # Inputs: > # > # Outputs: > N0 = 8; # As suggested by Jakes > N = 4*N0+2; # An accurate approximation > wd = 2*pi*fd; # Maximum Doppler frequency > t = t0 + [0:Ns-1]*Ts; > tf = t[end] + Ts; > coswt = [ sqrt(2)*cos(wd*t'); 2*cos(wd*cos(2*pi/N*[1:N0])*t') ] > h = E0/sqrt(2*N0+1)*exp(im*[ phi_N pi/(N0+1)*[1:N0]']) * coswt > return h, tf; > end > # Saved this as "jakes_model.jl" > > > My first call results in > julia> include( "jakes_model.jl" ) > Jakes_Flat (generic function with 4 methods) > > julia> @time Jakes_Flat( 926, 1e-6, 50000, 0, 1, 0 ) > elapsed time: 0.65922234 seconds (61018916 bytes allocated) > > julia> @time Jakes_Flat( 926, 1e-6, 50000, 0, 1, 0 ) > elapsed time: 0.042468906 seconds (17204712 bytes allocated, 63.06% gc > time) > > For first execution, Julia is taking huge amount of time. On second call, > even though Julia take considerably less(0.042468906 sec) than first( > 0.65922234 sec), it's still much higher to Matlab(0.008357 sec). > I'm using Matlab R2014b and Julia v0.3.10 on Mac OSX10.10. > > - vish >
