# Benchmarking BigInteger

Last TForge commits contain PiBench console application that calculates decimal digits of Pi using Machin’s formula; the execution takes about 30 seconds on my laptop. The code was written to compare the execution time of subsequent TForge revisions, but it can also be used to compare TForge BigCardinal and BigInteger types with .NET 4.0 BigInteger type.

Here is Delphi PiBench code:

```program PiBench;

{\$APPTYPE CONSOLE}

uses
SysUtils, Diagnostics, tfNumerics;

var
StopWatch: TStopWatch;
PiDigits: BigCardinal;

procedure BenchMark;
var
Factor, Num, Den: BigCardinal;
Term: BigCardinal;
N, M: Cardinal;

begin
PiDigits:= 0;
Factor:= BigCardinal.Pow(10, 10000);
Num:= 16 * Factor;
Den:= 5;
N:= 1;
repeat
Term:= Num div (Den * (2 * N - 1));
if Term = 0 then Break;
if Odd(N)
then PiDigits:= PiDigits + Term
else PiDigits:= PiDigits - Term;
Den:= Den * 25;
Inc(N);
until N = 0;
M:= N;
Num:= 4 * Factor;
Den:= 239;
N:= 1;
repeat
Term:= Num div (Den * (2 * N - 1));
if Term = 0 then Break;
if Odd(N)
then PiDigits:= PiDigits - Term
else PiDigits:= PiDigits + Term;
Den:= Den * 239 * 239;
Inc(N);
until N = 0;
M:= (M + N) div 2;
// M last digits may be wrong
PiDigits:= PiDigits div BigCardinal.Pow(10, M);
end;

begin
ReportMemoryLeaksOnShutdown:= True;
try
Writeln('Benchmark test started ...');
StopWatch:= TStopWatch.StartNew;
BenchMark;
StopWatch.Stop;
Writeln(PiDigits.AsString);
PiDigits.Free;
Writeln;
Writeln('Elapsed ms: ', StopWatch.ElapsedMilliseconds);
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
```

And here is equivalent C# application:

```using System;
using System.Numerics;
using System.Diagnostics;

namespace PiBench
{
class Program
{
static void Main(string[] args)
{
int N, M;
BigInteger Term;
Console.WriteLine("Benchmark test started ...");
Stopwatch Watch = new Stopwatch();
Watch.Start();
BigInteger PiDigits = 0;
BigInteger Factor = BigInteger.Pow(10, 10000);
BigInteger Num = 16 * Factor;
BigInteger Den = 5;
for(N = 1; N != 0; N++){
Term = Num / (Den * (2 * N - 1));
if (Term == 0) break;
if ((N & 1) != 0) PiDigits = PiDigits + Term;
else PiDigits = PiDigits - Term;
Den = Den * 25;
}
M = N;
Num = 4 * Factor;
Den = 239;
for(N = 1; N != 0; N++){
Term = Num / (Den * (2 * N - 1));
if (Term == 0) break;
if ((N & 1) != 0) PiDigits = PiDigits - Term;
else PiDigits = PiDigits + Term;
Den = Den * 239 * 239;
}
M = (M + N) / 2;
// M last digits may be wrong
PiDigits = PiDigits / BigInteger.Pow(10, M);
Watch.Stop();
Console.WriteLine(PiDigits);
Console.WriteLine();
Console.WriteLine("Elapsed ms: " + Watch.ElapsedMilliseconds.ToString());