Решили перенести некоторую часть php кода на zephir ради производительности.
В частности для одной из задач необходимо делать большое кол-во расчетов дистанции.
Сделал простой тест на Zephir и на php. Код на php работает быстрее.
Работали ли вы с zephir? Может быть я что-то упускаю?
Код класса:
class Geometry {
public static function run(array $list, int $count) -> void {
int i = 0;
while (i < count) {
static::distanceStatic($list[i][0], $list[i][1], $list[i][2], $list[i][3]);
let i = i + 1;
}
}
public static function distanceStatic(float $x1, float $y1, float $x2, float $y2) -> float {
return sqrt(($x1 - $x2) * ($x1 - $x2) + ($y1 - $y2) * ($y1 - $y2));
}
}
Код теста
$list = [];
$count = 10000;
$i = 0;
while ($i++ < $count) {
$list[] = [
rand(0, 100000) + 0.00001,
rand(0, 100000) + 0.00001,
rand(0, 100000) + 0.00001,
rand(0, 100000) + 0.00001,
];
}
$time = microtime(true);
$j = 0;
while ($j++ < 100) {
\Zephir\Geometry::run($list, $count);
}
echo "==== ".(microtime(true) - $time)."\n";
$time = microtime(true);
$j = 0;
while ($j++ < 100) {
$i = -1;
while ($i++ < $count - 1) {
\Zephir\Geometry::distanceStatic($list[$i][0], $list[$i][1], $list[$i][2], $list[$i][3]);
}
}
echo "====".(microtime(true) - $time)."\n";
$time = microtime(true);
$j = 0;
while ($j++ < 100) {
$i = -1;
while ($i++ < $count - 1) {
Geometry::distanceStatic($list[$i][0], $list[$i][1], $list[$i][2], $list[$i][3]);
}
}
echo "==== ".(microtime(true) - $time)."\n";
Результаты:
1.1973118782043
0.97038388252258
0.92160511016846