Bump @Steve Vavasis. Did you ever file an issue on this? https://github.com/JuliaLang/julia/issues
On Saturday, August 2, 2014 9:03:25 PM UTC-5, Tim Holy wrote: > > 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, Steve Vasavis 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 > >
