Short circuiting..

Discussion in 'C Programming' started by ram, Apr 3, 2004.

  1. ram

    ram Guest

    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;
     
    ram, Apr 3, 2004
    #1
    1. Advertising

  2. ram

    Leor Zolman Guest

    On 3 Apr 2004 02:03:50 -0800, (ram) wrote:

    >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()
    > )
    > )
    >
    > )


    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>snip
    Using if/else (f = 0): 1.472
    Using &&/||e (f = 0): 1.592

    d:\src\learn>snip
    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:
    www.bdsoft.com/tools/stlfilt.html
     
    Leor Zolman, Apr 3, 2004
    #2
    1. Advertising

  3. On 3 Apr 2004 02:03:50 -0800, (ram) wrote:

    >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


    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 '('

    >
    > 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;




    <<Remove the del for email>>
     
    Barry Schwarz, Apr 3, 2004
    #3
  4. ram

    ram Guest

    .....

    hi,

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


    no its not!! i had to stuff a 1 at the end;

    > Thirdly, code 2 has more ')' than '('
    >

    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
     
    ram, Apr 9, 2004
    #4
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Pho Bo Vien

    Short circuiting validation controls

    Pho Bo Vien, Apr 28, 2004, in forum: ASP .Net
    Replies:
    2
    Views:
    376
  2. Dave Opstad
    Replies:
    16
    Views:
    465
    Duncan Booth
    Mar 11, 2005
  3. kj
    Replies:
    11
    Views:
    475
    Jean-Michel Pichavant
    Mar 23, 2010
  4. Billy Mays

    Short-circuiting in C

    Billy Mays, May 26, 2011, in forum: C Programming
    Replies:
    63
    Views:
    1,667
    88888 Dihedral
    Aug 28, 2012
  5. Andrea Crotti

    avoid import short-circuiting

    Andrea Crotti, Mar 16, 2012, in forum: Python
    Replies:
    0
    Views:
    126
    Andrea Crotti
    Mar 16, 2012
Loading...

Share This Page