There's something else wrong. It makes no sense that the time hit should be so 
large; evaluating sin is _expensive_, much more than a conditional, especially 
since this one will work perfectly with the CPU's branch-point prediction.

I tried it using @time rather than tic/toc, and the extra information provided 
by @time revealed that there is allocation -> some kind of type problem. 
(Basically you should always use @time in preference to tic/toc, it's just 
much more informative.) Then, I left the `if` in place but commented out the 
`else` part, and the performance of the two functions became identical. So 
there's something about the else branch that's messing up type inference (and 
as far as I can tell it shouldn't, so it's probably a bug).

Can you please file an issue?

--Tim


On Saturday, August 02, 2014 09:03:40 PM Jameson Nash wrote:
> constant propagation is almost implemented in inference.jl (it's quite
> similar to type propagation), but it isn't active now:
> https://github.com/JuliaLang/julia/issues/5560
> 
> On Sat, Aug 2, 2014 at 8:33 PM, <[email protected]> wrote:
> > Dear Julia colleagues,
> > 
> > I'm reviving this old thread because I am also trying to create two
> > versions of my balanced-tree code, the fast version and the debug version,
> > and I am trying to figure out the appropriate way for one source-code file
> > to yield two versions.  In C++, the usual technique is a -DDEBUG
> > compilation flag, followed by #ifdef DEBUG ... #else ... #endif macros.
> > 
> > I thought that maybe in Julia I could accomplish this with ordinary "if"
> > statements  since the compiler could optimize away unused branches, but it
> > doesn't seem to work:
> > 
> > module testcodegen1
> > 
> > function t1(x::Float64)
> > 
> >     s = 0.0
> >     for i = 1 : 20000000
> >     
> >         s += sin(x)
> >     
> >     end
> >     s
> > 
> > end
> > 
> > function t2(x::Float64)
> > 
> >     s = 0.0
> >     for i = 1 : 20000000
> >     
> >         if true
> >         
> >             s += sin(x)
> >         
> >         else
> >         
> >             s += sin(2*x)
> >         
> >         end
> >     
> >     end
> >     s
> > 
> > end
> > 
> > end
> > 
> > Clearly t1 and t2 are equivalent, but t2 has an unreachable code branch
> > that could be optimized away.  However, the compiler doesn't seem to
> > recognize this:
> > 
> > julia> tic(); testcodegen1.t1(3.0);  toc()
> > tic(); testcodegen1.t1(3.0);  toc()
> > elapsed time: 0.216690647 seconds
> > 0.216690647
> > 
> > julia> tic(); testcodegen1.t2(3.0);  toc()
> > tic(); testcodegen1.t2(3.0);  toc()
> > elapsed time: 0.53437478 seconds
> > 0.53437478
> > 
> > It seems that using ordinary 'if' statements to distinguish the debugging
> > mode entails a big performance hit.
> > 
> > Thanks for the help,
> > Steve Vavasis
> > 
> > On Wednesday, May 29, 2013 1:46:21 PM UTC-4, Simon Hardy-Francis wrote:
> >> Consider this simple Perl script:
> >> 
> >> use strict;
> >> use Time::HiRes;
> >> 
> >> my $t1 = Time::HiRes::time;
> >> foreach (1..50000000) {
> >> }
> >> my $t2 = Time::HiRes::time;
> >> 
> >> my $t3 = Time::HiRes::time;
> >> my $debug = 0;
> >> foreach (1..50000000) {
> >> 
> >>    if ($debug) { printf qq[my debug line: %u], $_; }
> >> 
> >> }
> >> my $t4 = Time::HiRes::time;
> >> 
> >> my $t5 = Time::HiRes::time;
> >> use constant DEBUG => 0;
> >> foreach (1..50000000) {
> >> 
> >>    if (DEBUG) { printf qq[my debug line: %u], $_; }
> >> 
> >> }
> >> my $t6 = Time::HiRes::time;
> >> 
> >> printf qq[%f seconds for plain loop\n], $t2 - $t1;
> >> printf qq[%f seconds for negative if() loop \n], $t4 - $t3;
> >> printf qq[%f seconds for compiled out loop \n], $t6 - $t5;
> >> 
> >> The output is:
> >> 
> >> $ perl example.pl
> >> 1.372535 seconds for plain loop
> >> 1.899815 seconds for negative if() loop
> >> 1.370118 seconds for compiled out loop
> >> 
> >> The nice thing is that "if (DEBUG) { printf qq[my debug line: %u], $_; }"
> >> line gets compiled away and there is no resulting negative if() at
> >> run-time. This technique is very useful for instrumenting Perl code with
> >> verbose logging which doesn't slow down production code (by executing
> >> many
> >> negative 'if' statements) when verbosity is dialed down.
> >> 
> >> Is there an equivalent way to achieve the same performance results in
> >> julia?
> >> 
> >> Thanks,
> >> Simon

Reply via email to