LINUX.ORG.RU

SBCL vs LuaJit

 ,


0

4

Много лет пользовался сайтом «Computer Benchmark Game»,

http://benchmarksgame.alioth.debian.org/

И вот такой облом. Несколько лет назад с сайта выпилили многие языки, в т.ч. luajit. Что вывело его из моего поля зрения. А зря.

Я посмотрел вот сюда http://luajit.org/performance_x86.html , обалдел, скачал пару бенчмарков с упомянутой «игры» и сравнил sbcl и luajit на своей виртуальной 32-разрядной debian 8.

Получил вот что:

  • spectral-norm: lua быстрее в 1,1 раз
  • k-nucleotide: lua быстрее в 1,8 раз

На момент выпиливания luajit был далеко не так совершенен, но доверие к этому сайту у меня всё же пошатнулось.

И непонятно, как это получилось: ведь в lua нет статической типизации. Жду ваших мнений, а пока погляжу подробнее на исходники.

★★★★★

Бля, не угадал автора по заголовку.

ведь в lua нет статической типизации.

А в коммон лисп, блядь, она во все поля!

anonymous
()
Ответ на: комментарий от den73

Занялся spectral-norm. Уже удалось выяснить, что луа работает в одном потоке, а sbcl - в двух, что делает ситуацию особенно подозрительной. Код sbcl примерно в 5 раз длиннее и наполнен макросами :)

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

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

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

Знать бы, что это. Но во всяком случае, я его догнал. У меня два ядра, а тредов создавалось 4. Плюс не было деклараций оптимизации. Убрал треды, поставил декларации и догнал луну:

http://paste.lisp.org/display/159260

Расхождение в пользу луны на 4% - считаем, что догнал.

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

ВОт так с двумя тредами обогнал однотредовую луну (2,5 секунды, а у Луны 4,56), но честно ли это?

http://paste.lisp.org/ 3EVW/1

В Луне нет тредов, но можно сделать spawn и в некоторых примерах это делается.

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

Всё, при равном количестве тредов - догнать, но не перегнать. Посмотрим на второй бенчмарк...

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

Слышал, что в луа есть куча ручных оптимизаций, вплоть до контроля GC. Вряд ли ты сможешь написать адекватные тесты, и честно сравнить, не зная Lua на хорошем уровне.

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

Второй бенчмарк не осилил. Тесты луа я писать не пытаюсь. Я взял обычные тесты с шутаута и запустил их под luajit, не более того. Менял я только тест (один) для SBCL и в итоге догнал lua в этом тесте.

Ручная оптимизация с контролем GC в SBCL тоже есть, но я ей не пользовался. spectral-norm вроде не консит, с knucleotide не разобрался.

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

Нет в SBCL никакой «ручной оптимизации GC». Там есть только внутренний without-gc, потому что GC там сигналонебезопасно емнип. И есть with-pinned-objects для FFI. Хренью вы маетесь, товарищ.

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

Нет в SBCL никакой «ручной оптимизации GC».

Неправда. Вот зарекался ж с анонимусами общаться.

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

Трейсинг жит в тайтлупе сначала допирает, какие типы фигурируют внутри стейтментов, а потом генерит нативный код под это дело, получается трейс с эскейпами — если тип внезапно изменился, то нативка вылетает обратно в интерпретатор (тоже написанный чуть ли не на асме с макросами). Таким образом локальные луа-таблицы (хеш и массив 2-в-одном) превращаются в структуры/массивы на стеке и живут исключительно там, пока не вылетят обратно в интерпретатор по эскейпу. Вся замута возникает, когда код достаточно threaded, чтобы это начало происходить слишком часто с деградацией перформанса. На эту тему Майк изобрел hyperblock scheduling, который одно время рвал топовые трейсеры яваскрипта, не знаю как сейчас. Сишка рвалась по очевидным причинам — мало кто занимается profile-guided оптимизацией, а у жита это штатный режим. Помножь это на примитивность языка вот и получишь видимый результат.

GC там настраивается только двумя параметрами, которые обычно юзером не трогаются, потому что предсказать что-то без профилирования почти нельзя. Обычно его тупо отключают, когда он начинает мешать. Если интересно, еще можешь глянуть julia, она также неплохо показывает будучи полностью динамической с мультидиспетчем по сигнатуре вызова.

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

Чо там знать-то, это не перл.

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

А, да, ffi в луажите это часть жита — вызовы в сишку из трейса ничего не стоят, т.к. нет никакого прокси. Если писать не по-старинке врапперами, а напрямую через ffi.C, то от сишки не отличишь. Но это уже не чистый Луа, он навсегда застрял в 5.1/5.2-compatible.

anonymous
()

Вреде же не раз обсуждалось, что на том сайте бенчамрки — говно.

anonymous
()
Ответ на: комментарий от den73

другой ананимус

luajit сильно крут, уважаю. Однажды офигел: в простом тесте C долго не мог его догнать по скорости, сравнялся только при -O3 и то лишь при представлении вещественных числе как double. На float сишка по любому сливала. И язык приятный, очень легко пишется. Отставил его с сожалением после того как не смог побороть баги в ffi.C на больших массивах, хотя может просто версия старая/руки из жопы

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

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

anonymous
()

На том же сайте кложур обгоняет лисп на большинстве тестов, в каком-то тесте обгоняет жабу, а жаба кое где обгоняет сишку.

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

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

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

Должен же я за свой же базар отвечать :)

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

Аминь.

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

ведь в lua нет статической типизации.

Ей и в CL не пахнет.

Блин. Пять звёзд. И охота бред писать? Пойди лучше чайку попей или пописай, всё дело будет.

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

Ты пишешь нам бред. (declare (type ...)) это не статическая типизация

anonymous
()

Ну и ещё раз для таких тугих как ТС: отключить GC совсем и глобально в SBCL(берем с gencgc) без потоков теоретически можно, установив *gc-inhibit* в t , а *interrupts-enabled* в nil, а в SBCL с потоками это чревато трудноотлавлеваеми дедлоками и прочими радостями жизни. Поступать так будет только дикий отморозок. Локально отключить можно с without-gcing, но тоже с очень большой осторожностью

anonymous
()

И непонятно, как это получилось

Mike Pall

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

Не дописал своё лично мнение, что without-gcing хоть и «виден» из пакета sb-sys, является макрой для чисто внутреннего использования

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

Человек не особо спец в вопросе, вот и мерещатся ему всякие анонимные «интернет-хулиганы»

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

можно проще

CL-USER> (documentation 'sb-impl::without-gcing 'function)

«Executes the forms in the body without doing a garbage collection. It inhibits both automatically and explicitly triggered collections. Finally, upon leaving the BODY if gc is not inhibited it runs the pending gc. Similarly, if gc is triggered in another thread then it waits until gc is enabled in this thread.

Implies SB-SYS:WITHOUT-INTERRUPTS for BODY, and causes any nested SB-SYS:WITH-INTERRUPTS to signal a warning during execution of the BODY.

Should be used with great care, and not at all in multithreaded application code: Any locks that are ever acquired while GC is inhibited need to be always held with GC inhibited to prevent deadlocks: if T1 holds the lock and is stopped for GC while T2 is waiting for the lock inside WITHOUT-GCING the system will be deadlocked. Since SBCL does not currently document its internal locks, application code can never be certain that this invariant is maintained.»

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

Человек не особо спец в вопросе, вот и мерещатся ему всякие анонимные «интернет-хулиганы»

Нет. Это способ не отвечать «за базар», когда нет аргументов.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.