Hi,
I created a prototype, although it's pretty rough. It can overload operators
and calculate not only between `BcNum` but also between `BcNum` and `int` or
`string`.
https://github.com/php/php-src/pull/13741
I compared the execution times.
Test code:
```
<?php
$start = microtime(true);
$num = new BcNum('3.650000001', 10);
$num2 = new BcNum('4.2335185', 10);
for ($i = 0; $i < 1000000; $i++) {
$num3 = str_repeat('1', rand(1, 1));
$num4 = str_repeat('1', rand(1, 1));
$num = $num + $num3;
$num2 = $num2 - $num4;
$num = $num + $num2;
}
var_dump('BcNum and string: ' . microtime(true) - $start);
$start = microtime(true);
$num = new BcNum('3.650000001', 10);
$num2 = new BcNum('4.2335185', 10);
for ($i = 0; $i < 1000000; $i++) {
$num3 = new BcNum(str_repeat('1', rand(1, 1)), 10);
$num4 = new BcNum(str_repeat('1', rand(1, 1)), 10);
$num = $num + $num3;
$num2 = $num2 - $num4;
$num = $num + $num2;
}
var_dump('BcNum and BcNum: ' . microtime(true) - $start);
$start = microtime(true);
$num = '3.650000001';
$num2 = '4.2335185';
for ($i = 0; $i < 1000000; $i++) {
$num3 = str_repeat('1', rand(1, 1));
$num4 = str_repeat('1', rand(1, 1));
$num = bcadd($num, $num3, 10);
$num2 = bcsub($num2, $num4, 10);
$num = bcadd($num, $num2, 10);
}
var_dump('bcadd, bcsub: ' . microtime(true) - $start);
```
Result:
```
string(33) "BcNum and string: 3.2775790691376"
string(32) "BcNum and BcNum: 4.3857049942017"
string(29) "bcadd, bcsub: 4.2680249214172"
```
The execution speed ranking does not change even if the calculation is done
simply by adding one time. When calculating between `BcNum`, the cost of
creating an instance is probably high. However, since this difference was
obtained after 1 million trials, it may be safe to assume that the difference
is not that big.
Personally, I think the main point of this proposal is the increased
convenience through operator overloading, not execution time.
Regards.
Saki