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

Reply via email to