Более года назад я опубликовал Блог пост Представляем мой JQ оболочка OQ Отказ Учитывая это было довольно некоторое время с тех пор, я решил перезапустить тесты, которые я сделал в оригинальном посте с целью увидеть, что все изменилось как в отношении OQ
сама и большая экосистема.
Методология
Я проверил последние версии пакетов в первом посте. Я также добавил версию Go YQ
Отказ
Испытаемые пакеты и версии для контрольных ориентиров включают в себя:
- JQ (
1.6
) – установлен черезPacman -S JQ
- YQ (GO) (
4.6.1
) – скачал последний двоичный от последней GH Release - YQ (Python) (
2.12.0
) – установлен черезPIP3 Установить YQ.
- OQ (
1.2.0
) – построен локально с кристаллом0.36.1
черезShards Build - производство --release
Каждый пакет был протестирован на одних и тех же 3 эталонных ориентирах в моем оригинальном посте, а также дополнительное эталон для XML
=> JSON
, главным образом, так как YQ (Python)
имеет выделенную команду для обработки XML
Вход/вывод, который я не учитывал в первом посте. Данные собраны через Время GNU команда. Например. /usr/bin/time -v
Отказ
Настраивать
ОС: 5.10.15-1-manjaro x86_64
ЦП: Intel I7-7700K
Память: 32 ГБ @ 3000 МГц
SSD: Samsung 970 EVO Плюс - 1tb.
Результаты
В этом разделе приведены результаты с ключевыми показателями метрик в форме таблицы. См. Приложение для необработанных эталонных данных.
Простой
Просто проходить через JSON
=> Json.
Затем подсчитав линии на довольно небольшой входной файл:
{ "guests": [ { "name": "Jim", "age": 17, "numbers": [ 1, 2, 3 ] }, { "name": "Bob", "age": 51, "numbers": [ 4, 5, 6 ] }, { "name": "Susan", "age": 85, "numbers": [ 7, 8, 9 ] } ] }
jq. | 3.040 | 0.02 |
YQ (GO) | 6.020 | 0.01 |
YQ (Python) | 14.728 | 0.07 |
овся | 6.536 | 0.07 |
Все пакеты выполняются относительно одинаково, ничего не заслуживают внимания.
Jeopardy.json.
Получение Длина
53 МБ JSON
файл.
Используемый файл: jeopardy.json Отказ
jq. | 230.320 | 0.66 |
YQ (GO) | 705.292 | 2.54 |
YQ (Python) | 2922.996 | 108.89 |
овся | 230.304 | 0.74 |
Этот тест привел к некоторым более полезным данным, заставляя истинную производительность каждого пакета быть более очевидной. JQ
и овся
лучший, будучи довольно сопоставимым как в использовании памяти, так и в исполнении. варья (идти)
Был лучший лучший, используя 3x память и взял ~ 3,5x дольше, чем OQ
Отказ YQ (Python)
был намного хуже; Используя 12,7x память и принимая 147x дольше, чем овся
.
Yaml => xml/json
Потребляя ~ 57 МБ Ямл
Файл и вывод XML
и JSON
Отказ
Используемый файл: SDE/BSD/INVITEMS.YAML
от Eve Online SDE Export Отказ
jq. | N / A. | N / A. |
YQ (GO) – JSON | 5202.032 | 32.77 |
YQ (Python) – Json | 5742.736 | 206.2 |
YQ (Python) – XML | 5742.704 | 217.17 |
OQ – JSON. | 575.6 | 14.01 |
OQ – JSON – SimpleyAml | 334.632 | 14.16 |
OQ – XML. | 649.984 | 15.77 |
OQ – XML – SimpleyAml | 334.504 | 15.83 |
Последний тест показал аналогичные метрики как предыдущий. JQ
не поддерживает не JSON
форматы Так что это было исключено. овся
Сделал лучшее с тем, что время исполнения является довольно стабильным, в то время как использование памяти сократилось вдвое при использовании нового Simpleyaml
Формат для ввода. Интересно YQ (GO)
Настоящее лучшее исполнение мудро в этом тесте, находясь только на 2,34х медленнее, но используя ~ 15,5x больше памяти. YQ (Python)
Еще раз было хуже, с использованием памяти немного хуже варья (идти)
, но с выполнением времени 15,5x медленнее, чем овся
.
XML => JSON
Потребляйте вывод последнего эталона и преобразовать его обратно в JSON
Отказ Этот тест в основном не является предвзятым как YQ (Python)
включает в себя выделенный подпассы XQ
для обработки XML
ввод, вывод.
jq. | N / A. | N / A. |
YQ (GO) | N / A. | N / A. |
YQ (Python) | 795.06 | 15.59 |
овся | 2600.964 | 20.28 |
Ни один JQ
или варья (идти)
Поддержка XML
вход, поэтому они были исключены. Выделенный подпассы окупился на YQ (Python)
, бьют OQ
справедливой марже в обоих потреблении памяти и времени выполнения. Похоже, это может транслировать XML
ввод, пока XML
вход для OQ
это единственный входной формат, который не может быть потоковым (пока).
Заключение
Кажется, производительность YQ (Python)
получил немного лучше с прошлого раз. Брить от 2 ГБ памяти и 2 минуты исполнения в jeopardy.json
ориентир. Однако он все еще находится намного самым медленным, и большинство голодных пакетов памяти (когда не использует XML
в качестве входного формата). варья (идти)
находится в лучшем месте, но все же имеет довольно высокое использование памяти в зависимости от точного использования. OQ
Кажется, все еще является наиболее эффективным в целом, так как память, так и время исполнения наравне с JQ
Отказ Благодаря сосредоточению на потоковую передачу данных, когда это возможно (все, кроме XML
ввод в данный момент); OQ
способен использовать гораздо меньше памяти сравнительно.
Приложение
Простой
jq.
Command being timed: "jq . data.json | wc -l" User time (seconds): 0.02 System time (seconds): 0.00 Percent of CPU this job got: 100% Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.02 Average shared text size (kbytes): 0 Average unshared data size (kbytes): 0 Average stack size (kbytes): 0 Average total size (kbytes): 0 Maximum resident set size (kbytes): 3040 Average resident set size (kbytes): 0 Major (requiring I/O) page faults: 0 Minor (reclaiming a frame) page faults: 288 Voluntary context switches: 1 Involuntary context switches: 0 Swaps: 0 File system inputs: 0 File system outputs: 0 Socket messages sent: 0 Socket messages received: 0 Signals delivered: 0 Page size (bytes): 4096 Exit status: 0 31
YQ (GO)
Command being timed: "./go-yq -Pj e . data.json | wc -l" User time (seconds): 0.01 System time (seconds): 0.00 Percent of CPU this job got: 105% Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.01 Average shared text size (kbytes): 0 Average unshared data size (kbytes): 0 Average stack size (kbytes): 0 Average total size (kbytes): 0 Maximum resident set size (kbytes): 6020 Average resident set size (kbytes): 0 Major (requiring I/O) page faults: 0 Minor (reclaiming a frame) page faults: 617 Voluntary context switches: 76 Involuntary context switches: 2 Swaps: 0 File system inputs: 0 File system outputs: 0 Socket messages sent: 0 Socket messages received: 0 Signals delivered: 0 Page size (bytes): 4096 Exit status: 0 31
Используя -j
и -П
Варианты репликации поведения по умолчанию других двоичных файлов.
YQ (Python)
Command being timed: "yq . data.json | wc -l" User time (seconds): 0.06 System time (seconds): 0.00 Percent of CPU this job got: 87% Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.07 Average shared text size (kbytes): 0 Average unshared data size (kbytes): 0 Average stack size (kbytes): 0 Average total size (kbytes): 0 Maximum resident set size (kbytes): 14728 Average resident set size (kbytes): 0 Major (requiring I/O) page faults: 4 Minor (reclaiming a frame) page faults: 3637 Voluntary context switches: 43 Involuntary context switches: 1 Swaps: 0 File system inputs: 1328 File system outputs: 0 Socket messages sent: 0 Socket messages received: 0 Signals delivered: 0 Page size (bytes): 4096 Exit status: 0 31
овся
Command being timed: "oq . data.json | wc -l" User time (seconds): 0.06 System time (seconds): 0.01 Percent of CPU this job got: 104% Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.07 Average shared text size (kbytes): 0 Average unshared data size (kbytes): 0 Average stack size (kbytes): 0 Average total size (kbytes): 0 Maximum resident set size (kbytes): 6536 Average resident set size (kbytes): 0 Major (requiring I/O) page faults: 0 Minor (reclaiming a frame) page faults: 808 Voluntary context switches: 58 Involuntary context switches: 2 Swaps: 0 File system inputs: 0 File system outputs: 0 Socket messages sent: 0 Socket messages received: 0 Signals delivered: 0 Page size (bytes): 4096 Exit status: 0 31
Jeopardy.json.
jq.
216930 Command being timed: "jq length jeopardy.json" User time (seconds): 0.59 System time (seconds): 0.06 Percent of CPU this job got: 99% Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.66 Average shared text size (kbytes): 0 Average unshared data size (kbytes): 0 Average stack size (kbytes): 0 Average total size (kbytes): 0 Maximum resident set size (kbytes): 230320 Average resident set size (kbytes): 0 Major (requiring I/O) page faults: 0 Minor (reclaiming a frame) page faults: 59454 Voluntary context switches: 1 Involuntary context switches: 26 Swaps: 0 File system inputs: 0 File system outputs: 0 Socket messages sent: 0 Socket messages received: 0 Signals delivered: 0 Page size (bytes): 4096 Exit status: 0
YQ (GO)
216930 Command being timed: "./go-yq e length jeopardy.json" User time (seconds): 3.41 System time (seconds): 0.22 Percent of CPU this job got: 143% Elapsed (wall clock) time (h:mm:ss or m:ss): 0:02.54 Average shared text size (kbytes): 0 Average unshared data size (kbytes): 0 Average stack size (kbytes): 0 Average total size (kbytes): 0 Maximum resident set size (kbytes): 705292 Average resident set size (kbytes): 0 Major (requiring I/O) page faults: 0 Minor (reclaiming a frame) page faults: 176999 Voluntary context switches: 787 Involuntary context switches: 163 Swaps: 0 File system inputs: 0 File system outputs: 0 Socket messages sent: 0 Socket messages received: 0 Signals delivered: 0 Page size (bytes): 4096 Exit status: 0
YQ (Python)
216930 Command being timed: "yq length jeopardy.json" User time (seconds): 108.62 System time (seconds): 0.86 Percent of CPU this job got: 100% Elapsed (wall clock) time (h:mm:ss or m:ss): 1:48.89 Average shared text size (kbytes): 0 Average unshared data size (kbytes): 0 Average stack size (kbytes): 0 Average total size (kbytes): 0 Maximum resident set size (kbytes): 2922996 Average resident set size (kbytes): 0 Major (requiring I/O) page faults: 0 Minor (reclaiming a frame) page faults: 816903 Voluntary context switches: 13512 Involuntary context switches: 586 Swaps: 0 File system inputs: 0 File system outputs: 0 Socket messages sent: 0 Socket messages received: 0 Signals delivered: 0 Page size (bytes): 4096 Exit status: 0
овся
216930 Command being timed: "oq length jeopardy.json" User time (seconds): 0.70 System time (seconds): 0.12 Percent of CPU this job got: 110% Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.74 Average shared text size (kbytes): 0 Average unshared data size (kbytes): 0 Average stack size (kbytes): 0 Average total size (kbytes): 0 Maximum resident set size (kbytes): 230304 Average resident set size (kbytes): 0 Major (requiring I/O) page faults: 0 Minor (reclaiming a frame) page faults: 59966 Voluntary context switches: 13569 Involuntary context switches: 7 Swaps: 0 File system inputs: 0 File system outputs: 0 Socket messages sent: 0 Socket messages received: 0 Signals delivered: 0 Page size (bytes): 4096 Exit status: 0
Yaml => xml/json
jq.
N/A.
YQ (GO)
Json.
Command being timed: "./go-yq -Pj e . invItems.yaml > invItems.go-yq.json" User time (seconds): 47.66 System time (seconds): 1.46 Percent of CPU this job got: 149% Elapsed (wall clock) time (h:mm:ss or m:ss): 0:32.77 Average shared text size (kbytes): 0 Average unshared data size (kbytes): 0 Average stack size (kbytes): 0 Average total size (kbytes): 0 Maximum resident set size (kbytes): 5202032 Average resident set size (kbytes): 0 Major (requiring I/O) page faults: 0 Minor (reclaiming a frame) page faults: 1395040 Voluntary context switches: 37244 Involuntary context switches: 1922 Swaps: 0 File system inputs: 0 File system outputs: 138984 Socket messages sent: 0 Socket messages received: 0 Signals delivered: 0 Page size (bytes): 4096 Exit status: 0
YQ (Python)
Json.
Command being timed: "yq . invItems.yaml > invItems.python-yq.json" User time (seconds): 205.35 System time (seconds): 1.82 Percent of CPU this job got: 100% Elapsed (wall clock) time (h:mm:ss or m:ss): 3:26.20 Average shared text size (kbytes): 0 Average unshared data size (kbytes): 0 Average stack size (kbytes): 0 Average total size (kbytes): 0 Maximum resident set size (kbytes): 5742736 Average resident set size (kbytes): 0 Major (requiring I/O) page faults: 0 Minor (reclaiming a frame) page faults: 1587436 Voluntary context switches: 13384 Involuntary context switches: 1836 Swaps: 0 File system inputs: 0 File system outputs: 138984 Socket messages sent: 0 Socket messages received: 0 Signals delivered: 0 Page size (bytes): 4096 Exit status: 0
XML
Command being timed: "yq -s -x --xml-root items --xml-dtd {"item": .[] | .} invItems.yaml > invItems.python-yq.xml" User time (seconds): 215.17 System time (seconds): 2.03 Percent of CPU this job got: 100% Elapsed (wall clock) time (h:mm:ss or m:ss): 3:37.17 Average shared text size (kbytes): 0 Average unshared data size (kbytes): 0 Average stack size (kbytes): 0 Average total size (kbytes): 0 Maximum resident set size (kbytes): 5742704 Average resident set size (kbytes): 0 Major (requiring I/O) page faults: 0 Minor (reclaiming a frame) page faults: 1683522 Voluntary context switches: 32842 Involuntary context switches: 1031 Swaps: 0 File system inputs: 0 File system outputs: 195072 Socket messages sent: 0 Socket messages received: 0 Signals delivered: 0 Page size (bytes): 4096 Exit status: 0
овся
Json.
Command being timed: "./oq -i yaml . invItems.yaml > invItems.oq.json" User time (seconds): 12.90 System time (seconds): 12.24 Percent of CPU this job got: 179% Elapsed (wall clock) time (h:mm:ss or m:ss): 0:14.01 Average shared text size (kbytes): 0 Average unshared data size (kbytes): 0 Average stack size (kbytes): 0 Average total size (kbytes): 0 Maximum resident set size (kbytes): 575600 Average resident set size (kbytes): 0 Major (requiring I/O) page faults: 0 Minor (reclaiming a frame) page faults: 231391 Voluntary context switches: 289799 Involuntary context switches: 166 Swaps: 0 File system inputs: 0 File system outputs: 138984 Socket messages sent: 0 Socket messages received: 0 Signals delivered: 0 Page size (bytes): 4096 Exit status: 0
Command being timed: "./oq -i simpleyaml . invItems.yaml > invItems.oq.simple.json" User time (seconds): 12.27 System time (seconds): 12.18 Percent of CPU this job got: 172% Elapsed (wall clock) time (h:mm:ss or m:ss): 0:14.16 Average shared text size (kbytes): 0 Average unshared data size (kbytes): 0 Average stack size (kbytes): 0 Average total size (kbytes): 0 Maximum resident set size (kbytes): 334632 Average resident set size (kbytes): 0 Major (requiring I/O) page faults: 0 Minor (reclaiming a frame) page faults: 89229 Voluntary context switches: 2981745 Involuntary context switches: 246 Swaps: 0 File system inputs: 0 File system outputs: 138984 Socket messages sent: 0 Socket messages received: 0 Signals delivered: 0 Page size (bytes): 4096 Exit status: 0
XML
Command being timed: "./oq -i yaml -o xml --xml-root items . invItems.yaml" User time (seconds): 16.00 System time (seconds): 12.04 Percent of CPU this job got: 177% Elapsed (wall clock) time (h:mm:ss or m:ss): 0:15.77 Average shared text size (kbytes): 0 Average unshared data size (kbytes): 0 Average stack size (kbytes): 0 Average total size (kbytes): 0 Maximum resident set size (kbytes): 649984 Average resident set size (kbytes): 0 Major (requiring I/O) page faults: 0 Minor (reclaiming a frame) page faults: 249933 Voluntary context switches: 381174 Involuntary context switches: 266 Swaps: 0 File system inputs: 0 File system outputs: 195072 Socket messages sent: 0 Socket messages received: 0 Signals delivered: 0 Page size (bytes): 4096 Exit status: 0
Пример вывода:
0 0 0 0 -1 0 - ...
0 1 0 0 -1 0
Command being timed: "oq -i simpleyaml -o xml --xml-root items . invItems.yaml" User time (seconds): 15.27 System time (seconds): 11.99 Percent of CPU this job got: 172% Elapsed (wall clock) time (h:mm:ss or m:ss): 0:15.83 Average shared text size (kbytes): 0 Average unshared data size (kbytes): 0 Average stack size (kbytes): 0 Average total size (kbytes): 0 Maximum resident set size (kbytes): 334504 Average resident set size (kbytes): 0 Major (requiring I/O) page faults: 0 Minor (reclaiming a frame) page faults: 89233 Voluntary context switches: 3029485 Involuntary context switches: 298 Swaps: 0 File system inputs: 0 File system outputs: 195072 Socket messages sent: 0 Socket messages received: 0 Signals delivered: 0 Page size (bytes): 4096 Exit status: 0
XML => JSON
jq.
N/A.
YQ (GO)
N/A.
YQ (Python)
Command being timed: "xq .items invItems.python-yq.xml > invItems.python-yq.xml.json" User time (seconds): 16.37 System time (seconds): 0.39 Percent of CPU this job got: 107% Elapsed (wall clock) time (h:mm:ss or m:ss): 0:15.59 Average shared text size (kbytes): 0 Average unshared data size (kbytes): 0 Average stack size (kbytes): 0 Average total size (kbytes): 0 Maximum resident set size (kbytes): 795060 Average resident set size (kbytes): 0 Major (requiring I/O) page faults: 0 Minor (reclaiming a frame) page faults: 341577 Voluntary context switches: 14927 Involuntary context switches: 87 Swaps: 0 File system inputs: 0 File system outputs: 168064 Socket messages sent: 0 Socket messages received: 0 Signals delivered: 0 Page size (bytes): 4096 Exit status: 0
овся
Command being timed: "./oq -i xml .items invItems.oq.xml > invItems.oq.xml.json" User time (seconds): 20.25 System time (seconds): 16.87 Percent of CPU this job got: 183% Elapsed (wall clock) time (h:mm:ss or m:ss): 0:20.28 Average shared text size (kbytes): 0 Average unshared data size (kbytes): 0 Average stack size (kbytes): 0 Average total size (kbytes): 0 Maximum resident set size (kbytes): 2600964 Average resident set size (kbytes): 0 Major (requiring I/O) page faults: 0 Minor (reclaiming a frame) page faults: 766666 Voluntary context switches: 2117666 Involuntary context switches: 1249 Swaps: 0 File system inputs: 0 File system outputs: 168064 Socket messages sent: 0 Socket messages received: 0 Signals delivered: 0 Page size (bytes): 4096 Exit status: 0
Оригинал: “https://dev.to/blacksmoke16/oq-a-portable-performant-jq-wrapper-part-2-5h6l”