Since it is in function, it is not timing copile time but only for-loop. If 
it were in @time foo() it would time compilation.


On Wednesday, June 1, 2016 at 2:30:16 PM UTC+3, Andreas Lobinger wrote:
>
> It's valid and interesting to measure full roundtrip including compile 
> time like you do, however in examples like this, the julia overhead on 
> compiling dominates your measurement.
> You could put your code into a package and pre-compile. 
>
> In any case your not measuring the time to run the code only.
>
> On Wednesday, June 1, 2016 at 1:15:54 PM UTC+2, Mosè Giordano wrote:
>>
>> 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è
>>
>

Reply via email to