Benchmark between BC Math and Decimal
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
use Decimal\Decimal; | |
/* Number of times to perform each calculation. */ | |
$iterations = 1000000; | |
/* Candidates */ | |
define("DECIMAL", "decimal"); | |
define("BC_MATH", "bcmath"); | |
/* Values used for each benchmark */ | |
$samples = [ | |
"int" => [ | |
1, | |
2, | |
7, | |
13, | |
57, | |
123456789, | |
987654321, | |
-123456789, | |
-987654321, | |
PHP_INT_MAX, | |
PHP_INT_MIN, | |
], | |
"string" => [ | |
"0.1", | |
"0.0000123456789", | |
"12345.6789", | |
"-98765.4321", | |
"9.87654321", | |
"-1.23456789", | |
"0.00000000123456789", | |
"-0.00000000123456789", | |
"12345.6789", | |
"-12345.6789", | |
], | |
]; | |
/* Calculates the runtime of each candidate, prints progress, updates report. */ | |
function benchmark(string $action, array $calculations) | |
{ | |
global $samples; | |
global $iterations; | |
echo "\n\t$action"; | |
echo "\n\t" . str_repeat("-", strlen($action)); | |
foreach ($samples as $type => $values) { | |
/* Each candidate has a calculation function. */ | |
foreach ($calculations as $name => $calculation) { | |
echo "\n\t\t$name\ttype: $type\t"; | |
$start = microtime(true); | |
for ($i = 0; $i < $iterations; $i++) { | |
$calculation($values); | |
} | |
$runtime = microtime(true) - $start; | |
$result = $calculation($values); | |
/* Display results as we go... */ | |
echo "time: " . round($runtime, 4) . "\t"; | |
echo "result: " . rtrim(rtrim($result, '0'), '.'); | |
} | |
} | |
} | |
/** | |
* ADD | |
*/ | |
benchmark("add", [ | |
BC_MATH => function(array $values): string { | |
$result = "0"; | |
foreach ($values as $value) { | |
$result = bcadd($result, $value, 50); | |
} | |
return $result; | |
}, | |
DECIMAL => function(array $values): string { | |
$result = new Decimal("0", 100); | |
foreach ($values as $value) { | |
$result = $result + $value; | |
} | |
return (string) $result; | |
}, | |
]); | |
/** | |
* SUBTRACT | |
*/ | |
benchmark("sub", [ | |
BC_MATH => function(array $values): string { | |
$result = "0"; | |
foreach ($values as $value) { | |
$result = bcsub($result, $value, 50); | |
} | |
return $result; | |
}, | |
DECIMAL => function(array $values): string { | |
$result = new Decimal("0", 100); | |
foreach ($values as $value) { | |
$result = $result - $value; | |
} | |
return (string) $result; | |
}, | |
]); | |
/** | |
* MULTIPLY | |
*/ | |
benchmark("mul", [ | |
BC_MATH => function(array $values): string { | |
$result = "1"; | |
foreach ($values as $value) { | |
$result = bcmul($result, $value, 50); | |
} | |
return $result; | |
}, | |
DECIMAL => function(array $values): string { | |
$result = new Decimal("1", 100); | |
foreach ($values as $value) { | |
$result = $result * $value; | |
} | |
return (string) $result; | |
}, | |
]); | |
/** | |
* DIVIDE | |
*/ | |
benchmark("div", [ | |
BC_MATH => function(array $values): string { | |
$result = '1'; | |
foreach ($values as $value) { | |
$result = @bcdiv($result, $value, 50); | |
} | |
return (string) $result; | |
}, | |
DECIMAL => function(array $values): string { | |
$result = new Decimal('1', 100); | |
foreach ($values as $value) { | |
$result = $result / $value; | |
} | |
return (string) $result; | |
}, | |
]); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment