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