I just started experimenting with Julia, as a platform for rapid
prototyping for some more exotic molecular modelling applications where no
black-box software exists. So far I like very much what I find. To test its
performance, I implemented a simple Lennard-Jones energy and force assembly
5 times:
1. Julia1 : a "pretty" code, how I would like to write i
2. Julia2 : an ugly code with some performance optimisation
3. C : an even uglies C code
4. Matlab1 : pretty matlab code
5. Matlab2 : ugly matlab code
Typical runtimes for 30 particles (s):
Julia1: 1.37
Julia2: 0.74
C: 0.0267
Matlab1: 12.51
Matlab2: 1.91
Good news 1: Julia 1 kill Matlab1 and clearly beats Matlab2 as well.
Good news 2: Julia2 is only about twice as fast as Julia1
Bad news: I cannot get better than a factor of 3 of C, which is not bad,
but not the 70-99% that the Julia webpage promises :)
(and this C code is even called from Julia, otherwise I would get
another little bit of speed-up)
Any advise on further performance improvements would be great appreciated?
(JULIA2 is copied below, I can provide the other codes as well if helpful)
(grouping the multiplications more cleverly makes virtually no
difference)
Many thanks,
Christoph
JULIA2
function energy_inline(x)
E = 0.0
dE = zeros(size(x))
N = size(x,2)
d = size(x,1)
for n = 1:(N-1)
for k = (n+1):N
r = x[:,k] - x[:,n]
s = 0.; for i=1:d; s += r[i]*r[i]; end
E += 1./(s*s*s*s*s*s) - 2. / (s*s*s)
dJ = -12. * (1./(s*s*s*s*s*s*s) - 1./(s*s*s*s)) * r
dE[:, k] += dJ
dE[:, n] -= dJ
end
end
return E, dE
end