I did say "big integers" in the sense "sin(x) where x > 2pi" not BigInt. I should have said numbers instead of integers. I think part of the problem is that openlibm might do a better job to get high precision with large numbers (> 2pi) than your regular libm installation. You can also see that libm and openlibm does not agree on the last 3 digits. Can you try to benchmark sin of numbers less than 100?
How did you get Julia? If downloaded a nightly distribution, you might also get a less optimized version of openlibm that gives worse performance, than what I am seeing. Ivar kl. 21:54:14 UTC+1 lørdag 1. mars 2014 skrev Andrea Pagnani følgende: > > Hi Ivar, > > I tried your version on my system (which I called test2.jl) and > julia> test2() > 1.9558914085412562 > elapsed time: 0.31957987 seconds (23456 bytes allocated) > 1.9558914085412367 > elapsed time: 1.488734269 seconds (136 bytes allocated) > 1.9558914085412367 > elapsed time: 1.549758093 seconds (136 bytes allocated) > > Some misconfiguration on my system? > > Also it does not seems to be something related to BigInt as > > function test3() > > const N=10000000; > @time begin > s = 0.0 > for i=1.0:1.0:float64(N) > s+= ccall((:sin,"libc"),Float64,(Float64,),i) > end > println(s) > end > @time begin > s = 0.0 > for i=1.0:1.0:float64(N) > s += sin(i) > end > println(s) > end > end > > Now everything is Float64, yet > > julia> test3() > 1.9558914085412562 > elapsed time: 0.321183789 seconds (320 bytes allocated) > 1.9558914085412367 > elapsed time: 1.521137678 seconds (320 bytes allocated) > > > > > On Saturday, March 1, 2014 8:19:05 PM UTC+1, Ivar Nesje wrote: >> >> Andreas: You compare libopenlibm to the system libm >> >> function test1() >> const N=10000000; >> @time begin >> s = 0.0 >> for i=1:float(N) >> s+= ccall((:sin,"libc"),Float64,(Float64,),i) >> end >> println(s) >> end >> @time begin >> s = 0.0 >> for i=1:float(N) >> s+= >> Base.nan_dom_err(ccall((:sin,"libopenlibm"),Float64,(Float64,),i),i) >> end >> println(s) >> end >> @time begin >> s::Float64 = 0.0 >> for i=1:float(N) >> s += sin(i) >> end >> println(s) >> end >> end >> test1 (generic function with 1 method) >> >> does not give a significant difference between the built in `sin` >> function and ccall. >> >> Ivar >> >> >> kl. 19:57:03 UTC+1 lørdag 1. mars 2014 skrev Andreas Noack Jensen >> følgende: >>> >>> But it is weird that if the definition from math.jl is added such that >>> >>> function test1() >>> const N=10000000; >>> @time begin >>> s = 0.0 >>> for i=1:float(N) >>> s+= ccall((:sin,"libc"),Float64,(Float64,),i) >>> end >>> println(s) >>> end >>> @time begin >>> s = 0.0 >>> for i=1:float(N) >>> s+= nan_dom_err(ccall((:sin,"libm"),Float64,(Float64,),i),i) >>> end >>> println(s) >>> end >>> @time begin >>> s::Float64 = 0.0 >>> for i=1:float(N) >>> s += sin(i) >>> end >>> println(s) >>> end >>> end >>> >>> I get >>> >>> julia> Newton.test1() >>> >>> 1.9558914085412562 >>> elapsed time: 0.437409166 seconds (136 bytes allocated) >>> 1.9558914085412562 >>> elapsed time: 0.429992684 seconds (136 bytes allocated) >>> 1.9558914085412367 >>> elapsed time: 2.495838008 seconds (136 bytes allocated) >>> >>> >>> >>> 2014-03-01 19:50 GMT+01:00 Ivar Nesje <[email protected]>: >>> > >>> > Why do you care for the performance of sin of big integers? I got >>> about 2 time difference with your test function, but when I did the test >>> with 1.2 as the constant value to take sin of and got. >>> > >>> > julia> function test1() >>> > const N=10000000; >>> > @time begin >>> > s = 0.0 >>> > for i=1:N >>> > s+= ccall((:sin,"libc"),Float64,(Float64,),1.2) >>> > end >>> > println(s) >>> > end >>> > @time begin >>> > s = 0.0 >>> > for i=1:N >>> > s += sin(1.2) >>> > end >>> > println(s) >>> > end >>> > end >>> > test1 (generic function with 1 method) >>> > >>> > julia> test1() >>> > 9.320390858253522e6 >>> > elapsed time: 1.071002334 seconds (168 bytes allocated) >>> > 9.320390858253522e6 >>> > elapsed time: 0.930658493 seconds (168 bytes allocated) >>> > >>> > >>> > It would be expected that the native sin function in Julia would be >>> slower than ccall to libc, because we check the return value to raise an >>> exception (instead of a NaN value). >>> > >>> > We also use openlibm for our math functions, and the performance of >>> that might be different from the libm on your system. >>> > >>> > Ivar >>> > >>> > kl. 18:53:39 UTC+1 lørdag 1. mars 2014 skrev Andrea Pagnani følgende: >>> >> >>> >> Dear all, >>> >> >>> >> julia's trigonometric functions seem to be almost 5 time slower than >>> their libc counterpart (at least on my MacBook Pro OS X 10.9.2): >>> >> >>> >> function test1() >>> >> >>> >> const N=10000000; >>> >> @time begin >>> >> s = 0.0 >>> >> for i=1:N >>> >> s+= ccall((:sin,"libc"),Float64,(Float64,),i) >>> >> end >>> >> println(s) >>> >> end >>> >> @time begin >>> >> s = 0.0 >>> >> for i=1:N >>> >> s += sin(i) >>> >> end >>> >> println(s) >>> >> end >>> >> end >>> >> >>> >> >>> >> If you run this simple code you obtain >>> >> >>> >> julia> test1() >>> >> 1.9558914085412562 >>> >> elapsed time: 0.275374895 seconds (88 bytes allocated) >>> >> 1.9558914085412367 >>> >> elapsed time: 1.567108143 seconds (88 bytes allocated) >>> >> 1.9558914085412367 >>> >> >>> >> The same behaviour is obtained with other trigonometric functions >>> >> Is this something to be expected? >>> >>> >>> >>> >>> -- >>> Med venlig hilsen >>> >>> Andreas Noack Jensen >>> >>
