100% agree. I did not wanted to imply that this is a bug but a "surprising 
slow pass" (at least for me). So absolutely thumbs up if there is an 
opportunity of optimizing this case!

Cheers,

Tobias

Am Dienstag, 31. Mai 2016 16:14:27 UTC+2 schrieb Stefan Karpinski:
>
> This isn't exactly a bug since the answer is correct, it's an optimization 
> that we don't yet do. (If all of those are bugs then every language 
> implementation has an infinite number of bugs.) But yes, fixing this is on 
> track. There's been a lot of recent work on Julia's IR which should make 
> this problem resolvable soon.
>
> On Tue, May 31, 2016 at 1:11 AM, 'Tobias Knopp' via julia-users <
> julia...@googlegroups.com <javascript:>> wrote:
>
>> It would be great if this is resolvable. It took me quite some time to 
>> determine that this is an issue in my own code. My mental model was that 
>> type stability is about the return type being statically dependent on the 
>> input parameter types. That a local binding has changed is quite a 
>> different thing.
>>
>> Cheers,
>>
>> Tobias
>>
>> Am Dienstag, 31. Mai 2016 02:14:21 UTC+2 schrieb Yichao Yu:
>>>
>>> On Mon, May 30, 2016 at 7:54 PM, Erik Schnetter <schn...@gmail.com> 
>>> wrote: 
>>> > Yichao 
>>> > 
>>> > What is the known bug here: That Julia doesn't handle this more 
>>> efficiently, 
>>>
>>> The bug is that the type instability here is spurious. 
>>>
>>> > or that the variable `x` can change its type from Int to Float64? 
>>> > 
>>> > In this example, are there two variables `x` (the argument and the 
>>> > explicitly declared local variable), or should the declaration be an 
>>> error? 
>>> > 
>>> > -erik 
>>> > 
>>> > On Mon, May 30, 2016 at 7:47 PM, Yichao Yu <yyc...@gmail.com> wrote: 
>>> >> 
>>> >> On Mon, May 30, 2016 at 7:23 PM, David P. Sanders <dpsa...@gmail.com> 
>>>
>>> >> wrote: 
>>> >> > 
>>> >> > 
>>> >> > El lunes, 30 de mayo de 2016, 19:11:47 (UTC-4), FANG Colin 
>>> escribió: 
>>> >> >> 
>>> >> >> function t1(n::Int, x::Int, a::Float64) 
>>> >> >>    x::Float64 = x 
>>> >> >>    for i in 1:n 
>>> >> >>         x += a 
>>> >> >>    end 
>>> >> >>     x 
>>> >> >> end 
>>> >> >> @time t1(10^6, 1, 1.0) 
>>> >> >> 
>>> >> >> 0.005445 seconds (1.00 M allocations: 15.259 MB) 
>>> >> > 
>>> >> > 
>>> >> > In t1, x changes type during the function, from Int to Float64, so 
>>> the 
>>> >> > function is type *un*stable, as shown by @code_warntype, 
>>> >> > and as suggested by the huge number of allocations. 
>>> >> > 
>>> >> > In t2, x is always a Float64, and the function is type stable. 
>>> >> > 
>>> >> >> 
>>> >> >> 
>>> >> >> 
>>> >> >> 
>>> >> >> 
>>> >> >> function t2(n::Int, y::Int, a::Float64) 
>>> >> >>    x::Float64 = y 
>>> >> >>    for i in 1:n 
>>> >> >>         x += a 
>>> >> >>    end 
>>> >> >>     x 
>>> >> >> end 
>>> >> >> @time t2(10^6, 1, 1.0) 
>>> >> >> 
>>> >> >> 0.001044 seconds (6 allocations: 192 bytes) 
>>> >> >> 
>>> >> >> 
>>> >> >> 
>>> >> >> 
>>> >> >> The @code_warntype of the 2 functions are very similar. However, 
>>> the 
>>> >> >> llvm 
>>> >> >> code generated from t2 is a lot simpler. 
>>> >> > 
>>> >> > 
>>> >> > The @code_warntype of the two functions is very *different*. (This 
>>> is 
>>> >> > easier 
>>> >> > to see in the REPL than in the notebook, if 
>>> >> > that is the problem.) 
>>> >> > 
>>> >> >> 
>>> >> >> 
>>> >> >> Does it suggest that if we want to change the type of an argument, 
>>> we'd 
>>> >> >> better create a new variable? 
>>> >> 
>>> >> This is a known bug. Fortunately it's easy to catch with 
>>> code_warntype. 
>>> > 
>>> > 
>>> > 
>>> > 
>>> > -- 
>>> > Erik Schnetter <schn...@gmail.com> 
>>> > http://www.perimeterinstitute.ca/personal/eschnetter/ 
>>>
>>
>

Reply via email to