Short circuiting..

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • ram

    #1

    Short circuiting..

    hi all,
    apart from readability, and not wanting the otherwise different
    statements to be assumed as one single loong statement [ the comma
    operator ]
    what are the pros/cons of both snippets?

    i tried this out on a small piece of code and the latter part using
    short circuiting takes about half the time as the if else version;
    gcc 3.2 , amdk6-2 running vectorlinux;

    cheers
    ram

    herz a snippet of code..
    =============== === 1
    int flag = f ;

    if( f)
    { if1() ;
    if2() ;
    if3() ;
    }
    else
    { e1() ;
    e2() ;
    }
    =============== ===== 2 =
    int flag = f ;
    (
    (
    ( f ) && ( if1() ,
    if2() ,
    if3()
    )
    ) ||
    ( e1() , e2()
    )
    )

    )

    =============== ==== end of snippets;
  • Leor Zolman

    #2
    Re: Short circuiting..

    On 3 Apr 2004 02:03:50 -0800, cintyram@yahoo. com (ram) wrote:
    [color=blue]
    >hi all,
    > apart from readability, and not wanting the otherwise different
    >statements to be assumed as one single loong statement [ the comma
    >operator ]
    >what are the pros/cons of both snippets?
    >
    >i tried this out on a small piece of code and the latter part using
    >short circuiting takes about half the time as the if else version;
    > gcc 3.2 , amdk6-2 running vectorlinux;
    >
    >cheers
    >ram
    >
    > herz a snippet of code..
    >============== ==== 1
    > int flag = f ;
    >
    > if( f)
    > { if1() ;
    > if2() ;
    > if3() ;
    > }
    > else
    > { e1() ;
    > e2() ;
    > }
    >============== ====== 2 =
    > int flag = f ;
    > (
    > (
    > ( f ) && ( if1() ,
    > if2() ,
    > if3()
    > )
    > ) ||
    > ( e1() , e2()
    > )
    > )
    >
    > )[/color]

    I'm really suspicious of your timing results, because even using my old
    non-optimizing C compiler from 1979, I would not have expected measurably
    different results from those two constructs.

    I'm going to go out on a limb here and show C++ code, because I happen to
    have a convenient C++ timing utility. I apologize in advance if this
    offends anyone; I hope folks will understand the motivation:. I'm going to
    make the bold assumption that code generation facilities for if/else vs.
    short-circuit conditional evaluation are going to be pretty much the same
    across C and C++.

    So here's my test program:

    #include <iostream>
    #include "ESTLUtil.h "
    using namespace std;
    using namespace ESTLUtils;

    void if1(){}
    void if2(){}
    int if3(){ return 1;}
    void e1(){}
    int e2(){ return 1;}

    #define ITERATIONS 100000000

    int main()
    {
    int f = 1;
    int i;

    {
    Timer t;
    for (i = 0; i < ITERATIONS; ++i)
    {
    if( f)
    { if1() ;
    if2() ;
    if3() ;
    }
    else
    { e1() ;
    e2() ;
    }
    }
    cout << "Using if/else (f = " << f << "): " << t << endl;
    }

    {
    Timer t;
    for (i = 0; i < ITERATIONS; ++i)
    {
    int flag = f ;
    (
    (
    ( f ) && ( if1() ,
    if2() ,
    if3()
    )
    ) ||
    ( e1() , e2()
    )
    );
    }
    cout << "Using &&/||e (f = " << f << "): " << t << endl;
    }
    return 0;
    }


    Note I had to "pick" a logical return value for if3 and e2 (in the second
    section) in order for the conditionals to compile. I just used 1.

    I ran it for f equal to 0 and again for f equal to 1. results:

    d:\src\learn>sn ip
    Using if/else (f = 0): 1.472
    Using &&/||e (f = 0): 1.592

    d:\src\learn>sn ip
    Using if/else (f = 1): 2.153
    Using &&/||e (f = 1): 2.133

    I got slightly different results each time, with the if/else /usually/
    being a tiny bit faster (although they often came in equal). Since this
    timing utility records real time and not CPU time, Windows task activity
    can account for the variations. I don't a Unix box to run a "time" test
    on.

    In any case, hardly a case of the timing discrepancy you described.

    I'd stick to the if/else.

    BTW, if anyone cares to try this with the timing utility I'm using, the
    header file (ESTLUtil.h) is part of each of the "InitUtil" distributions
    available on my web site.
    -leor

    --
    Leor Zolman --- BD Software --- www.bdsoft.com
    On-Site Training in C/C++, Java, Perl and Unix
    C++ users: Download BD Software's free STL Error Message Decryptor at:
    An STL Error Decryptor for C++ by Leor Zolman of BD Software - available to download here

    Comment

    • Barry Schwarz

      #3
      Re: Short circuiting..

      On 3 Apr 2004 02:03:50 -0800, cintyram@yahoo. com (ram) wrote:
      [color=blue]
      >hi all,
      > apart from readability, and not wanting the otherwise different
      >statements to be assumed as one single loong statement [ the comma
      >operator ]
      >what are the pros/cons of both snippets?
      >
      >i tried this out on a small piece of code and the latter part using
      >short circuiting takes about half the time as the if else version;
      > gcc 3.2 , amdk6-2 running vectorlinux;
      >
      >cheers
      >ram[/color]

      First off, they don't behave the same. If f is non-zero:

      Code 1 will execute if1, if2, and if3 and never execute e1 or e2.

      Code 2 will execute if1, if2, and if3. If if3 evaluates to
      anything that compares equal to 0, it will also execute e1 and e2.

      Secondly, is code 2 valid if if3 evaluates to void?

      Thirdly, code 2 has more ')' than '('
      [color=blue]
      >
      > herz a snippet of code..
      >============== ==== 1
      > int flag = f ;
      >
      > if( f)
      > { if1() ;
      > if2() ;
      > if3() ;
      > }
      > else
      > { e1() ;
      > e2() ;
      > }
      >============== ====== 2 =
      > int flag = f ;
      > (
      > (
      > ( f ) && ( if1() ,
      > if2() ,
      > if3()
      > )
      > ) ||
      > ( e1() , e2()
      > )
      > )
      >
      > )
      >
      >============== ===== end of snippets;[/color]



      <<Remove the del for email>>

      Comment

      • ram

        #4
        Re: Short circuiting..

        .....

        hi,
        [color=blue]
        >
        > Secondly, is code 2 valid if if3 evaluates to void?
        >[/color]

        no its not!! i had to stuff a 1 at the end;
        [color=blue]
        > Thirdly, code 2 has more ')' than '('
        >[/color]
        The snippet was typed seperately..



        any way it was my mistake.. i did not test it properly.
        sorry :( ;

        for a few runs of a trivial program that just prints where it is
        printing from.. the output of /usr/bin/time indicated that the if-else code
        took 0m0.020s user time while the other one took 0m0.010s ;
        for five or six runs it was same..
        but when i add it up over 100,000 runs.. it looks like they are pretty
        much the same;

        but funny thing is time reports 0m0.000s also for some runs:) ;
        what is a better way of testing?
        cheers
        ram

        Comment

        Working...