Ok, now it makes more sense
function test4()
const N=100000000
const delta = 2pi / N
@time begin
s = 0.0
for i=0.0:delta:2pi
s+= ccall((:sin,"libc"),Float64,(Float64,),i)
end
println(s)
end
@time begin
s = 0.0
for i=0.0:delta:2pi
s += sin(i)
end
println(s)
end
end
returns
julia> test4()
7.00424467945944e-9
elapsed time: 1.63142133 seconds (352 bytes allocated)
7.034712528404704e-9
elapsed time: 1.912202446 seconds (352 bytes allocated)
Which makes a lot more sense. The point is in the large numbers involved in
the computation which, I agree, are not very frequent as argument of
trigonometric functions. Yet good old libc performs amazingly well.
On Saturday, March 1, 2014 10:24:55 PM UTC+1, Ivar Nesje wrote:
>
> 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
>>>>
>>>