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