Модуль PHP на Go

Потешную штуку показали на днях — php-go, позволяет писать модули для ПХП на Гоу. У меня как-то такой потребности не возникало, но попробовать-то интересно!

Пока ехал домой, думал что бы такое обернуть. По какой-то длинной ассоциативной цепочке всплыло как много лет назад я изучал чем быстрее всего посчитать длину юникодной строки. Тогда нагуглился способ через команды набора SSE2.

Ссылка давно протухла, но «Вебархив», к счастью, имеет копию страницы — статья называется «Ridiculous UTF-8 character counting».

Программа там на Си, я её минимально подпилил, чтобы она нормально компилировалась, завернул через cgo в Гоу, а оттуда при помощи php-go протащил как модуль ПХП.

Скриншот терминала с результатами тестирования производительности функций strlen: sse2_strlen (13.23), mb_strlen (4.74), iconv_strlen (252.72), strlen (0.15).

Заодно набросал небольшой бенчмарк и залил всё на гитхаб, если кому-то интересно. То ли все эти обёртки изрядно сказываются на стоимости вызова, то ли считать длину через SSE2 не такая уж хорошая идея, но производительностью получившегося решения я не впечатлился.

Зато попробовал php-go, вещь предельно простая, в случае нужды можно будет что-то быстренько набросать с её использованием.

Комментарии 5

Не про php-go № 1
Стало интересно, как считают длину строки другие варианты (кроме strlen(), который константный).

mb_strlen() считает длину как побочный эффект от конвертации из одной кодировки в другую https://github.com/php/php-src/blob/f24db7 … #L697-L714

iconv_strlen тоже конвертирует строку из одной кодировки в другую, но делает это по два символа, каждый раз проходя по строчке с самого начала https://github.com/php/php-src/blob/524f52 … #L764-L776

Кстати, а какой результат на этой же машине на чистом C/Go?
Евгений Степанищев автор № 4
Кстати, а какой результат на этой же машине на чистом C/Go?

Попробую померять попозже.

Евгений Степанищев автор № 5
Посмотрел как на Си. Количестве итераций пришлось увеличить в сто раз, в этом случае скорость выполнения — 1,2 секунды, это вместе с запуском откомпилированного.

Если поставить -Os, то получается 0,3—0,4 секунды.

Гоу, вместе с запуском программы — 1,4 секунды.