Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   C Programming (http://www.velocityreviews.com/forums/f42-c-programming.html)
-   -   Short circuiting.. (http://www.velocityreviews.com/forums/t317704-short-circuiting.html)

ram 04-03-2004 10:03 AM

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 04-03-2004 03:48 PM

Re: Short circuiting..
 
On 3 Apr 2004 02:03:50 -0800, cintyram@yahoo.com (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

Barry Schwarz 04-03-2004 07:36 PM

Re: Short circuiting..
 
On 3 Apr 2004 02:03:50 -0800, cintyram@yahoo.com (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>>

ram 04-09-2004 07:17 AM

Re: Short circuiting..
 
.....

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


All times are GMT. The time now is 10:10 PM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.