Short circuiting..

R

ram

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

Leor Zolman

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
 
B

Barry Schwarz

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

ram

.....

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
 

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
474,262
Messages
2,571,056
Members
48,769
Latest member
Clifft

Latest Threads

Top