Пишу, по большей части, про историю, свою жизнь и немного про программирование.

Модуль PHP на Go

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

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

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

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

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

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

5 комментариев
Не про php-go 2018

Стало интересно, как считают длину строки другие варианты (кроме strlen(), который константный).

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

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

Кстати, а какой результат на этой же машине на чистом C/Go?

aktuba 2018

zephir лучше)

Евгений Степанищев 2018

zephir лучше)

Почему он лучше? :)

Евгений Степанищев 2018

Кстати, а какой результат на этой же машине на чистом C/Go?

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

Евгений Степанищев 2018

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

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

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