https://github.com/nodeca/pako
Зарелизил порт zlib на яваскрипт. В распаковке яваскрипт оказался быстее :) . Пропустившим предыдущие серии повторяю - захотелось поразвлечься и выяснить для себя, насколько шустрый нынче явяскрипт и чего стоит разработка быстрого кода. Ну и попутно получить качественную библиотеку inflate/deflate, потому что с этим были напряги.
Бенчмарки:
node v0.10.26, 1mb sample:
deflate-dankogai x 4.74 ops/sec ±0.68% (15 runs sampled)
deflate-gildas x 4.61 ops/sec ±1.73% (15 runs sampled)
deflate-imaya x 3.10 ops/sec ±3.73% (11 runs sampled)
! deflate-pako x 7.11 ops/sec ±0.26% (21 runs sampled)
deflate-pako-untyped x 4.34 ops/sec ±1.35% (14 runs sampled)
deflate-zlib x 14.34 ops/sec ±2.90% (68 runs sampled)
inflate-dankogai x 31.29 ops/sec ±0.72% (56 runs sampled)
inflate-imaya x 30.49 ops/sec ±0.84% (53 runs sampled)
! inflate-pako x 70.00 ops/sec ±1.60% (71 runs sampled)
inflate-pako-untyped x 17.67 ops/sec ±1.27% (33 runs sampled)
inflate-zlib x 70.82 ops/sec ±1.69% (81 runs sampled)
node v0.11.11, 1mb sample:
deflate-dankogai x 5.61 ops/sec ±0.30% (17 runs sampled)
deflate-gildas x 4.97 ops/sec ±5.68% (16 runs sampled)
deflate-imaya x 3.53 ops/sec ±4.19% (12 runs sampled)
! deflate-pako x 11.52 ops/sec ±0.23% (32 runs sampled)
deflate-pako-untyped x 5.12 ops/sec ±1.44% (17 runs sampled)
deflate-zlib x 14.33 ops/sec ±3.34% (63 runs sampled)
inflate-dankogai x 42.96 ops/sec ±0.19% (57 runs sampled)
inflate-imaya x 85.05 ops/sec ±1.07% (71 runs sampled)
! inflate-pako x 97.58 ops/sec ±0.69% (80 runs sampled)
inflate-pako-untyped x 18.06 ops/sec ±0.65% (56 runs sampled)
inflate-zlib x 60.60 ops/sec ±2.04% (67 runs sampled)
Если кратко - маршалинг не бесплатный, и на распаковке это уже заметно. На упаковке потерями можно пренебречь, и яваскрипт уступает по скорости в 1.2-1.3 раза. Тестировалось под убунтой 12.04 с родным zlib.
Так что если разрабатываете на ноде, и есть тяжелые вычисления - не надо сразу ломиться делать модули на сях. Для многих случаев проще заколбасить прототип на яваскрипте, чтобы не терять время, а потом разбираться по обстоятельствам.
Конечно, недостатки при разработке быстрого яваскрипта тоже есть:
- нема хедеров, констант и макросов, как в сях (можно отчасти решить препроцессорами, но удобство сомнительное)
- ограниченная разрядность математики
- при работе с 32-разрядными целыми (например, crc32), желательно не форсить беззнаковые значения (uint32).
- нет удобных инструментов для отладки деоптимизаций (разве что IRHydra 2, но под нее надо ждать пока v8 в ноде обновят)
Из плюсов:
- не надо париться с поддержкой под разные платформы
- научить обезьяну писать мономорфный код проще, чем сделать из нее квалифицированного разработчика на С.