@Forx

Почему у zephir lang такая низкая производительность?

Решили перенести некоторую часть 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
  • Вопрос задан
  • 1121 просмотр
Пригласить эксперта
Ответы на вопрос 2
Ты вызываешь внутри кода distanceStatic

Статическую функцию
1 вызов через ядро PHP метода
2 тратиться на парсинг параметров

Тут 90% ушло в этот метод
Оптимизация inline еще не реализована

Либо убери этот метод и вынес код в run

Добавь issue для примера, как будет время кто нибудь поможет с inline
Ответ написан
nazarpc
@nazarpc
Open Source enthusiast
Последние версии PHP имеют уже встроенное кэширование опкодов, видимо С код, который генерирует Zephir менее оптимален, чем то, что производит Zend Optimizer.
Случается, что C код, скомпилированный с -O3 медленнее PHP, бывает такое.
Напишите расширение изначально на чистом C (чтобы исключить влияние Zephir), если слишком сложные расчёты - можно в отдельное приложение на другом языке вынести. Судя по всему на простом С такой код переписать не составит труда.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы