Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: Optimizing C code for speed - Saving Into A Variable First DOES Work

Author: Graham Laight

Date: 04:52:46 01/03/03

Go up one level in this thread


On January 01, 2003 at 11:50:58, Lieven Clarisse wrote:

>I was wondering if there is a good book about how to write efficient C code. I
>am not talking about algorithms, but the way *how* to write things, eg
>
>which is faster :
>do {}  while()    or     while () {}
>
>-------
>I know for instance that:
>
>ptr=&R[i];
>if((*ptr==3)||(*ptr==7)) {;}
>
>is faster then:
>
>if((R[i]==3)||(R[i]==7)) {;}
>
>Is there a good book that reviews all those kinds of tricks?
>
>regards,
>
>Lieven

Forgetting the pointer and saving to a variable DOES save time - and now I can
prove it!

Below is a web page I have written, with the button actions written in
JavaScript.

The "easy to maintain" button does a million loops using the

if((R[1]==3)||(R[1]==7))

construct, wheras the "Potentially Quicker" button does a million loops using
the

	x = R[1];
 	if((x==3)||(x==7))

construct. On my computer, with IE 5.5, it takes 2.013 seconds the easy way, but
only 1.883 seconds the quick way.

If you want to prove this for yourself:

1. copy the web page below

2. paste it into Notepad

3. save it to your c:\ drive as Graham_Demo.htm

4. point your web browser at it (I wrote and tested under IE 5.5 - should also
work under Netscape or Mozilla)

-g

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>
<head>
<title>Graham's Optimisation Demo</title>
</head>
<body>
<SCRIPT LANGUAGE="JavaScript">
function easyToMaintain()
{
 var R = new Array();
 R[0] = 1;
 R[1] = 2;
 R[2] = 3;

 var p = 0;
 var startTime = new Date();

 for (k = 0; k < 1000000; k++)
 {
 	if((R[1]==3)||(R[1]==7))
		p = p + 1;
 }

 var endTime = new Date();
 var totalTime = endTime.getTime() - startTime.getTime();
 alert("The easy to maintain version took " + totalTime + " milliseconds to
run");
}

function possiblyQuicker()
{
 var R = new Array();
 R[0] = 1;
 R[1] = 2;
 R[2] = 3;

 var p = 0;
 var x = 0;
 var startTime = new Date();

 for (k = 0; k < 1000000; k++)
 {
 	x = R[1];
 	if((x==3)||(x==7))
		p = p + 1;
 }

 var endTime = new Date();
 var totalTime = endTime.getTime() - startTime.getTime();
 alert("The potentially quicker version took " + totalTime + " milliseconds to
run");
}

</SCRIPT>
<input type="button" value="Test Easy-To-Maintain Version Of Code"
onclick="easyToMaintain()">
<input type="button" value="Test Possibly-Quicker Version Of Code"
onclick="possiblyQuicker()">
</body>
</html>



This page took 0 seconds to execute

Last modified: Thu, 15 Apr 21 08:11:13 -0700

Current Computer Chess Club Forums at Talkchess. This site by Sean Mintz.