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.