Hi all, I'm working on a Fortran77 code, but I'd much prefer to translate it to Julia. However, I've the impression that when working with large arrays (of the order of tens of thousands elements) Julia is way slower than the equivalent Fortran code. See the following examples:
Julia: function foo() array1 = rand(70, 1000) array2 = rand(70, 1000) array3 = rand(2, 70, 20, 20) bar = 0 @time for l = 1:1000, k = 1:20, j = 1:20, i = 1:70 bar = bar + (array1[i, l] - array3[1, i, j, k])^2 + (array2[i, l] - array3[2, i, j, k])^2 end end foo() Fortran77 (it uses some GNU extensions, so gfortran is required): program main implicit none double precision array1(70, 1000), array2(70, 1000), & array3(2, 70, 20, 20), bar, start, finish integer i, j, k, l call srand(time()) c Initialize "array1" and "array2" do j = 1, 1000 do i = 1, 70 array1(i, j) = rand() array2(i, j) = rand() enddo enddo c Initialize "array3" do l = 1, 2 do k = 1, 70 do j = 1, 20 do i = 1, 20 array3(i, j, k, l) = rand() enddo enddo enddo enddo c Do the calculations bar = 0 call cpu_time(start) do l = 1, 1000 do k = 1, 20 do j = 1, 20 do i = 1, 70 bar = bar + & (array1(i, l) - array3(1, i, j, k))**2 + & (array2(i, l) - array3(2, i, j, k))**2 enddo enddo enddo enddo call cpu_time(finish) print "(f10.6, a)", finish - start, " seconds" end program main This is the result of running the two programs on my computer: % julia --version julia version 0.4.5 % gfortran --version GNU Fortran (Debian 5.3.1-20) 5.3.1 20160519 Copyright (C) 2015 Free Software Foundation, Inc. GNU Fortran comes with NO WARRANTY, to the extent permitted by law. You may redistribute copies of GNU Fortran under the terms of the GNU General Public License. For more information about these matters, see the file named COPYING % julia -f test.jl 1.099910 seconds (84.00 M allocations: 1.252 GB, 7.14% gc time) % gfortran test.f&&./a.out 0.132000 seconds While Julia code is 3 times shorter than the Fortran77 code (and this one of the many reasons why I like Julia very much), it's also more than 8 times slower and my build of Julia 0.5 (updated to aa1ce87) performs even worse, it takes about 1.4 seconds. If I remove access to the arrays (just put "bar = bar" as loop body) then Julia is infinitely faster than Fortran in the sense that Julia takes 0.000000 seconds, Fortran 0.056000. Is this difference to be expected or are there tricks to fasten the Julia code? I should have gotten the order of nested loops right. @inbounds doesn't help that much. Parallelization is probably not an option because the code above is a small part of a larger loop that does data movement (can DistributedArrays help?). Bye, Mosè