LINUX.ORG.RU
ФорумTalks

скорость JS vs C. Эпизод 3.

 , , ,


1

2

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 в ноде обновят)

Из плюсов:

- не надо париться с поддержкой под разные платформы
- научить обезьяну писать мономорфный код проще, чем сделать из нее квалифицированного разработчика на С.

★★★★★

нема хедеров, констант и макросов, как в сях (можно отчасти решить препроцессорами, но удобство сомнительное)

Я не пробовал, но как насчёт привязать сишный препроцессор?

Sadler ★★★
()
Ответ на: комментарий от Deleted

Дык написано же как с CPU. В бенчмарке zlib присутствует.

А по памяти - там типизированные массивы. Если не лепить кусков на гигабайт и обрабатывать чанками, то нормально.

Vit ★★★★★
() автор топика

нема хедеров, констант и макросов

а я-то всегда думал что это надо засовывать в приемущества. :-)

подробнее:

отсутствие хеадеров — ну очевидно что чем меньше кода и кодовых файлов — тем лучше.

отсутствие констант — но в C/C++ тоже нет констант. ключевое слово ``const`` обозначает в C/C++ что переменная становится неизменяемой (однако это не константа.. это всё ещё переменная).

однако в C/C++ можно эмулировать константы через макросы (#define ...). однако код превращается в говно.

отсутствие макросов — это несомненное приемущество, так как мыкросы превращают код в говно..

вот такие мысли.. :-)

user_id_68054 ★★★★★
()
Последнее исправление: user_id_68054 (всего исправлений: 3)
Ответ на: комментарий от Sadler

Нафейхуа? Там своих хватает. Просто чем нестандартнее тулчейн, тем больше гимора для сторонних разработчиков и для последующей поддержки.

Ну и между нами девочками, препроцессорами обычно страдают набигаторы с других языков, которые еще не осилили жабаскрипт, и пытаются его превратить во что-то привычное. Через годик это обычно проходит :)

Vit ★★★★★
() автор топика
Ответ на: комментарий от user_id_68054

Абстрактные рассуждения не имеют практического смысла. Я пишу про весьма конкретный класс задач, с которым довелось столкнуться.

Vit ★★★★★
() автор топика
Ответ на: комментарий от abraziv_whiskey

Там трансляторами сделано. Это значит:

1. Кто-то до этого написал на сях.
2. Размер транслированного кода не маленький.

Если это приемлимо - вполне годный способ.

Vit ★★★★★
() автор топика

А я тестирую сеть и http на nodejs и c/c++. Nodejs сливает примерно в 4-6 раз по скорости req/sec c++ hello wordam :-) зато на равне с erlang и в 2.5 раза проигрывает vibe.d из D сообщества.

menangen ★★★★★
()

Всегда считал, что разработка на C на порядок проще, чем на JS, на последнем куда не шагни - грабли, а грабли Cей выучиваются за пару вечеров.

qrck ★★
()
Ответ на: комментарий от qrck

У всех свои предпочтения. Я под веб говнокожу, си там не в кассу. Тем более, лично мне нужно чтобы этот код в браузере работал.

Vit ★★★★★
() автор топика
Ответ на: комментарий от abraziv_whiskey

Я в курсе. Честно говоря, у них очень спорное направление. Гугловцы потому и не поддерживают asm.js, что у них и без него быстро работает.

Лучше б мозиловцы активнее свой движок точили и сделали встраивание в ноду. Я не держись зубами за v8. Просто на нем я могу разрабатывать без напрягов, а на лисьем сейчас так не получится.

Vit ★★★★★
() автор топика
Ответ на: комментарий от Vit

Исходники есть, но я же знаю, что лично вы в них копаться не будете :) C/C++ лично мне тоже не сдались, мне важно лишь знать что и во сколько раз быстрее/медленнее. Например, я для себя узнал, что erlang мне нафиг не нужен и go тоже, пока есть nodejs и vibe.d.

menangen ★★★★★
()

нема хедеров, констант

TypeScript имеет плагин для Node.js

grim ★★☆☆
()

а почему не 100 мегабайт сэмпл? 1 метр в кэш влезает, в этом есть что-то неинтересное.

dimon555 ★★★★★
()
Ответ на: комментарий от menangen

Это тема о явоскриптовых движках, а не просто что нода рулит и педалит. Исходники нужны для того, чтобы показывать, что в них нету ляпов. И тесты стоит писать тоже адекватные, под реальные задачи.

Vit ★★★★★
() автор топика
Ответ на: комментарий от dimon555

Не уверен. Стандартная сборка, 64-битная.

Vit ★★★★★
() автор топика
Ответ на: комментарий от dimon555

На 10 проверял, разницы не было. Сотку просто очень долго ждать, а я бенчмарки постоянно гоняю, чтобы убедиться что не накосячил.

Там все выложено, запустите на сотке, если сильно надо, но уверен что разницы не будет. Больше 200 мегов делать не стоит - я не делал для теста поточной обработки, и можете в размер яваскриптового пула упереться.

Vit ★★★★★
() автор топика
Ответ на: комментарий от Vit

Я лишь высказал свое мнение касательно сложности разработки. C - реально очень простой язык, в сравнении с JS, если идти дальше hello world-а. В JS стоолько возмножных костылей, что имхо нужно быть ооочень психологически устойчивым, что-бы на нем программировать. Я бы лично никогда не смог, мой удел - языки со строгой типизацией, позволяющие не тратить нервов ;) (Впрочем C к ним я бы не стал особо сильно относить, но я его и не имел в виду).

qrck ★★
()
Последнее исправление: qrck (всего исправлений: 1)
Ответ на: комментарий от qrck

Тут другой расклад, и больше менеджерский. Вот представьте, что люди вебдевят на яваскрипте. Глобально там си не нужен. А найти человека, который под ноду сишный модуль для вычислений слепает, не просадив скорость ни в самом си ни в маршалинге - не так просто. Ну а с плюсами шансов еще меньше.

Речь не о преимуществах или недостатках языков, а о том, куда проект рулить и что учитывать. Я просто выдаю расклад, какие цифры можно получить на яваскрипте, и во что это обойдется. В отрыве от всего остального на сях проще конечно. Но в жизни-то делать в отрыве от всего не получается.

Vit ★★★★★
() автор топика

на си есть прозрачная работа с тредами, памятью, бинарными данными и вагон готовых библиотек. начто вообще тебе усрался джс?

punya ★★
()
Ответ на: комментарий от Vit

Я с этим мало знаком, т.к. далек от Web Dev-а, так что я ни в чем не пытаюсь убедить ;)

(Впрочем если сервер-сайд - то разрабатывал как то как раз для Web системы одной, на прошлом рабочем месте, библиотеку занимающейся тяжелой математикой (точнее обработкой графики), сам Web код на JSP был, стыковка через SWIG и местами просто JNI, - вполне сносно себе получилось, хотя конечно разработка была довольно своеобразная и за отладкой не так мало времени ушло, да и после того как я ушел, я не уверен что у них остались разработчики, способные код поддерживать :) ).

qrck ★★
()
Ответ на: комментарий от qrck

В C++ есть constexpr и enum

да, кстате constexpr — похоже это то что надо!

user_id_68054 ★★★★★
()
Ответ на: комментарий от menangen

< C > простой, если писать алгоритмы в вакууме. Если писать на нём аналог nodejs - это тот ещё гемор.

Ровно тоже самое можно сказать и про JS - он простой если на нем писать алгоритмы в вакууме ;) А если реализовывать сложную систему, а не UI/AJAX фреймворк для веба, то жопа полная, т.к. банальное отсутствие типизации и нормального ООП оочень сильно усложнит жизнь.

qrck ★★
()

надо ждать пока v8 в ноде обновят

а самому пойти и обновить - всё сломается?

stevejobs ★★★★☆
()
Ответ на: комментарий от menangen

мне слегка кажется, что для задачи «массовый говнокодинг веб-приложений», оба сливают. Нода - динамическая, это заставляет ее _изучать_, а времени на изучение обычно нет. Под D нет нормальной поддержки IDE, а без IDE статика не особо помогает - времени вручную изучать ошибки нет.

stevejobs ★★★★☆
()
Ответ на: комментарий от Vit

почитал. если тебе надо

  • поддержка под разные платформы
  • научить обезьяну писать код

и ты выбираешь для этого джс вместо джавы или дотнета, то я тебе не завидую.

punya ★★
()
Последнее исправление: punya (всего исправлений: 1)
Ответ на: комментарий от stevejobs

Да, сравнивал. JVM сливает по количеству req/sec и Python Tornado, и NodeJS, и Erlang. Примерно в 1.5 раза питону и в 2.5 раза NodeJS/Erlang.

menangen ★★★★★
()
Ответ на: комментарий от stevejobs

Говнокодинг - да. Тут многие жалуются, что на JavaScript невозможно писать ничего серьёзного или, как сейчас, говнокодинг на javascript, мол, тоже сложен. Я считаю, что дело в опыте. Если человек начинал с php или c++, то ему сложно будет правильно организовать архитектуру. Многие вообще не понимают прототипную систему и её преимущество. Также многие калом мечут на асинхронные движки: twisted, nodejs. Потому, что тяжело им было, когда с наскока брали проекты на дописывание. Но, к примеру, сейчас асинхронные движки очень популярны, и внедряются везде, где не лень: в стандартный питон 3, в JVM - написали javascript vm, интегрированную в JVM, в c/c++ также популярен libevent, на котором сделан тот же vibe.d. Ну, а про говнокодеров что говорить? php вполне тру для них. Покрывает все сферы, платят мало им, говнокодеров полно, конкуренция большая, русский бизнес хочет всякие сертификаты, 1-эсы и всё это присобачить к сайтам на Drupal, потому, что хотят сайт за один месяц и за 15.000. Так что о таких идиотах даже написать нечего - они не двигают технологии, а лишь паразитируют на них. Книжек и материалов по php море, каждый школьник может сесть ковырять уже собранные WAMP и прочее. Поэтому, это отдельный мир рашкен-IT. Вон, на хабре был опрос недавно, по результатам которого стало ясно: 60% клиентам нужны начинающие (1 год) кодеры на php. Ни больше, ни меньше. Более крутым прогерам на пхп они платить не намерены. Лидирует 1С Битрикс. Я чуть не плакалЪ.

menangen ★★★★★
()
Ответ на: комментарий от menangen

Если у вас ява так слила, это означает только то, что вы не умеете ее готовить. Не люблю яву, но цифры откровенно левые.

Vit ★★★★★
() автор топика

яваскрипт уступает по скорости в 1.2-1.3 раза

Если в 5 местах в 1.2 раза, то это уже примерно в 2.5 раз медленнее. Разница между 100 и 250 мсек заметна гораздо меньше, чем между 10 и 25 секундами. Так что не везде этот ваш жабаскрипт стоит пихать.

PolarFox ★★★★★
()
Ответ на: комментарий от PolarFox

У вас в сложении и умножении скобочки не так встали :)

И еще раз, я не агитирую против языка С, я делюсь практическими цифрами, которые очень трудно найти, в отличие от фанбойских тестов.

А конечные решения надо принимать по конкретным проектам, учитывая тонны факторов, в т.ч. состав команд и долгосрочные перспективы.

Vit ★★★★★
() автор топика
Ответ на: комментарий от punya

В хорошем, опенсорсном. Идите смотреть на гитхабовском профиле, и не забивайте тред балабольством, если информация не представляет для вас интерес.

Vit ★★★★★
() автор топика
Ответ на: комментарий от Vit

Под жвм есть и нормальные языки - Scala, Clojre например.

Под Скалу есть self-contained web framework, Playframwork.

Олсо, под жвм можно писать даже на JS, но ума не приложу, зачем.

stevejobs ★★★★☆
()
Последнее исправление: stevejobs (всего исправлений: 1)
Ответ на: комментарий от stevejobs

Ну это лирика все. Я не против жвм и компании. Просто на моих проектах она как-то нафик не уперлась.

Вона, лучше слабайте бенчмарки для явовского ямла и дефлейта. Померяемся у кого VM толще и код прямее.

Vit ★★★★★
() автор топика

не надо сразу ломиться делать модули на сях.

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

Deleted
()
Ответ на: комментарий от Vit

Мне так многие говорят, но никто ещё не привел примера, где tornado или nodejs слили яве. Ява реально тормоз, это же все знают :-) Я тестировал примерно 5 фреймверков на java, все на production настройках, которые взяты у англоязычных бенчмаркеров, а также проверены на офф сайтах. Уж, люди, тестирующие лет 10 фреймверки, наверное, знают о чем пишут.
Вот пруф, тестируй:
http://stackoverflow.com/questions/12068390/netty-vs-tornado-by-performance

menangen ★★★★★
()
Ответ на: комментарий от menangen

А зачем вам чего-то доказывать про фреймворки, если они не имеют ни какого отношения к виртуальной машине? Тем более, на писькомерной синтетике, которой цена по пятачку за пучок. Вона, идите сами развлекаться, если заняться нечем http://www.cubrid.org/blog/dev-platform/inside-vertx-comparison-with-nodejs/ .

Vit ★★★★★
() автор топика

http://habrahabr.ru/post/216641/

Я фигею с комментов, дорогая редакция. Это ж какими долбодятлами надо быть, чтобы гнать такую пургу про asm.js и бенчмарки :)

Vit ★★★★★
() автор топика
Последнее исправление: Vit (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.