← All posts tagged PHP

kamenev
PHP BDB 181 653 делает BDB c типом базы db4
34 949 вставок/секунду делает BDB c типом базы gdbm

Если нужно использовать встраиваемую и быструю базу, то BDB c движком db4 отличный выбор.
kamenev
PHP gt.m При подключении GT.M через pipe к PHP удалось получить 51 398 вставок в секунду.
Глобалы при этом предварительно обнулялись.
Всего вставок делалось 1 000 000.

Типа:
Set ^a(5)=5

При оформлении того же как процедуры — 41 182 вставок в секунду.
Do test^speed(5,5)

Что неудивительно, учитывая затраты на вызов.

Потом я протестировал скорость полученного интерфейса с GT.M. При подачи перевода строки (минимальная команда) смог получить 118 722 операций/сек. Результат можно было улучшить, если делать обвязку из СИ-функций к GT.M.
$sM = '';

Если использовать примитивную операцию, которая требует небольшого парсинга со стороны GT.M и операции конкатенации + преобразования типов от PHP, то число операций уменьшается до 58 554/сек.
$sM = 'Set a='.$i;

Доля снижения из-за PHP вычисляем так 118 722 — 112 764 = 5958. Округлённо 6 000.

Итого: небольшой парсинг со стороны GT.M уменьшает доступную скорость со 118 722 операций/сек до 66 126 операций/секунду, т.е. в 1.8 раза.

Однако GT.M позволяет использовать несколько команд в одной строке.
При 2-х командах скорость: 78 259 вставок/секунду.
При 3-х: 106 643 вставок/секунду.
....
При 10-ти: 183 992 вставок/секунду.
...
При 20-ти: 201 288 вставок/секунду.

Усложняется парсинг каждой строки в GT.M и cоздание новых строк в PHP. Для упрощения парсинга уже имеет смысл использовать MUMPS-процедуры.

При использовании процедуры с 20 параметрами скорость составила 299 222 вставок/секунду.

Для сравнения я решил сравнить скорость одиночных вставок с MySql.
Create table ta (i BIGINT NOT NULL PRIMARY KEY, v BIGINT NOT NULL);

Для чистоты эксперимента вставлял по одной записи, сделал 1 индекс как в GT.M, подобрал похожие типы данных. MySql 5.5.
Скорость: 2602 инсертов в секунду.

При вставке сложным инсертом, когда в одном запросе вставлялось 20 строк, была получена цифра 4638 строк/секунду.

А теперь скорость чтения по ключу для 1000000 значений:

Для GT.M получил 57 320 выборок в секунду.
Использовалась команда:
Write ^i(i)

Для MySql 18 468 выборок в секунду.
Запрос:
Select v FROM ta WHERE i=число

ВЫВОДЫ: Несмотря на неоптимальный интерфейс для доступа к GT.M на вставке одиночных индексированных значений он быстрее в 19.7 раза. А при чтении быстрее 3.1 раза.

При использовании 20 команд в одной строке для GT.M скорость вставки увеличилась в 5.8 раз. При похожей технике для MySql скорость вставок возросла в 1.78 раза. При массовом посыле команд на вставку GT.M быстрее в 64.5 раза.

Теоретическая скорость интерфейса с GT.M составляет 118 722 операций/сек, однако уже при небольшом парсинге со стороны GT.M цифра составит 58 554 операций/сек.

КПД использования интерфейса у GT.M при вставке одиночными командами = 51 398/58 554 ~= 88%

P.S. Для доступа к MySQL из PHP использовалась библиотека ADOdb, что, наверное, на несколько процентов снижало результаты по MySql.
kamenev
PHP MUMPS gt.m Сравнивал быстродействие в консоли.
GT.M быстрее на 10%, чем PHP. Что, в принципе, не существенно.

Тест, конечно, сильно примитивный:

MUMPS
test
for i=1:1:100000000 Set n=i
quit

PHP
for ($i=1; $i <= 100000000; $i++) $n = $i;
die();