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; Readln; 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()); Console.ReadLine(); } } }

You can run both and compare; my tests show nearly the same execution time.

Advertisements