C Sharp Performance Tests: Squaring Numbers
The semester 2 coursework has begun, and this time there is a choice of either make a game to a specification, or produce a business related application to a specification. I have chosen the game.
To start off, I started writing a few mathematical functions that I would need when ewriting the game itself. I quickly found that one of things you do rather a lot is squaring numbers. In C♯ I have found 2 ways to square a number so far: a*a
and Math.Pow(a, 2)
, where a
is a number.
Even though it probably doesn't matter about the speed at which we square numbers (there are much better optimisations to make), I decided to test it anyway. I wrote this program:
using System;
using System.Diagnostics;
class Program
{
static void Main(string[] args)
{
Console.WriteLine("This program tests the performance of squaring numbers.\n");
Console.WriteLine("Iterations | a*a Time | Math.Pow(a, 2) Time");
Console.WriteLine("-----------|----------|--------------------");
int iterations = 100000;
double number = 3092d;
double result;
while(true)
{
Stopwatch timera = Stopwatch.StartNew();
for(int i = 0; i < iterations; i++)
{
result = number*number;
}
timera.Stop();
Stopwatch timerb = Stopwatch.StartNew();
for(int i = 0; i < iterations; i++)
{
result = Math.Pow(number, 2);
}
timerb.Stop();
Console.WriteLine(" {0,9} | {1,8} | {2}", iterations, timera.ElapsedMilliseconds.ToString(), timerb.ElapsedMilliseconds.ToString());
iterations += 100000;
System.Threading.Thread.Sleep(500); // make sure that we don't crash the server
}
}
}
I didn't have a Windows Machine handy when writing this post, so the binary has been compiled with mono's dcms
. Please leave a comment below if it doesn't work for you.
Everything is done with double
s to maek it a fair test because C♯'s Math.Pow
method will only accept a double
. The code sleeps for half a second between runs because I was writing this on the server that is serving the websitee, and I didn't want to crash it by accident :)
The results were rather shocking. The easiest way to display the results is in a graph:
A pastebin of the results can be found here.
As you can quite clearly see, Math.Pow()
is horribly inefficient compared to just multiplying a number by itself. Next time I am squaring numbers, I won't be using Math.Pow
again.