LINUX.ORG.RU

Метапрог-прототип, версия 11 + бенчмарк

 , ,


1

3

Следующая версия:

Метапрог-прототип 13 + LOR Browser

Скачать (читать файл с названием своего языка из архива!):

https://www111.zippyshare.com/v/Nq5mH4Sa/file.html

Версия 11 содержит оптимизации транслятора и исправления в Метапрог онлайн. В остальном различий с описанием 10 версии нет.

Версия 10 содержит несколько хотфиксов для транслятора диаграмм и онлайн-функционала. В остальном различий в сравнении с описанием 9 версии нет.

Версия 9 содержит хотфикс: в 8 версии были проблемы со скачиванием проектов через Метапрог онлайн. В остальном различий в сравнении с описанием 8 версии нет.

В текущей версии прототипа наконец-то исправлены проблемы с отображением справки в скомпилированном ехе (рекомендую изучить справочную систему) и реализованы условные схождения. Это означает, что на нем можно делать уже по-настоящему сложную логику. Например, бенчмарк, предложенный в прошлых темах. Другие уже сделали множество реализаций на разных текстовых языках программирования, я сделал реализацию на Лабвью - а теперь это возможно и на Метапроге. Исходная задача на бенчмарк: Метапрог-прототип, версия 6 + будильник на Метапроге (комментарий)

Пока что тест получился в целом неважнецкий, где-то на уровне С++. Полагаю, его еще можно оптимизировать до уровня рукописного Си, так как Метапрог может непосредственно оперировать сишными функциями, если надо - даже без помощи метапроговской стандартной библиотеки. Архив с сишными трансляциями бенчмарка и будильника на Метапроге:

https://www32.zippyshare.com/v/JlUIhEAn/file.html или https://drive.google.com/file/d/1lu1RVqqXEVGgZbviCfwrxFMhdDgvo6LT/view

Доступ к Метапрог-диаграммам можно получить через Метапрог онлайн (репозиторий «бенчмарк ЛОР»), открыть - в прототипе Метапрога.

Каждый бенчмарк проходит 10 повторений, во время каждого выводится 4 числа:

Номер повторения (0-9).

Время (миллисекунды) генерации 100000 строк длиной 100 байт и подсчета их хешей.

Время (миллисекунды) генерации 1000 строк по 20 байт и подсчета их хешей.

Время (миллисекунды) поиска вхождний по хешам.

В случае каждого нахождения вхождения в консоль/stdout выводятся подстрока и строка.

В тестах в случае совпадения хешей в консоль/stdout выводится строка «мяу». Кстати, совпадения хешей случаются даже с 20-символьными подстроками, хотя самих вхождений нет (идет дополнительная проверка).

Условное схождение присутствует, например, в функции генерации случайной английской буквы (A-Z_a-z.bmp, между условием и «+»). После слияния веток с данными (или жесткими последовательностями выполнения) от противоположных условий дальнейшие блоки выполняются в обеих случаях.

Есть разные функции генерации случайного числа, и они совершенно разные по скорости. Если использовать randombytes_uniform из библиотеки libsodium - генерация случайных строк работает в сотни раз медленнее, чем rand. Но функция randombytes_uniform из специальной криптографической библиотеки дает «по-настоящему» случайные числа, в отличие от строк из псевдослучайных чисел (rand), которые повторяются даже между разными запусками программы. Есть тесты, использующие разные функции для случайного числа при генерации 100000 строк по 100 байт. Генерация 1000 строк по 20 байт погоды не делает, тут во всех тестах randombytes_uniform. Уверен, что rand сократило б время генерации 1000 строк по 20 байт до нуля миллисекунд.

Подсчет хешей функцией nk_murmur_hash во всех случаях занимает ничтожную часть времени.

Также для тестирования на достоверность и корректность работы программы есть тесты с подстроками по 5 и 3 байта вместо 20. По ним видно, что бенчмарк работает корректно.

В Метапрог-диагармме подфункции/поддиагарммы могут быть представлены в виде ссылок на файлы (серо-зеленая дискетка при наведении мышью) или же быть частично или полностью отвязанными от файла на диске и полностью находиться в теле файла диагарммы (в таком случае цвет дискетки зависит от наличия и соответствия файлу на диске - путь к нему все же хранится в кластере/структуре диаграммы). Иногда это удобно, чтобы, например, сделать локальный форк подфункции. Например, чтобы использовать rand вместо randombytes_uniform, достаточно было форкнуть диаграмму основного бенчмарка и сделать отвязку от файлов на диске цепочки поддиаграмм, отвечающих за формирование массива случайных строк вплоть до функции генерации псевдослучайного числа. В итоге получились локальные форки функций без необходимости сохранять их в новые файлы. Подобным образом можно управлять и типами, такими как структура/выбор (struct/union), структура условного выбора типа (СУВТ, прямых аналогов в Си нет), пронумерованный список (enum) итд.

Бонус: будильник с проверкой введенных значений (сишная трансляция в файле alarm.c в архиве с бенчмарком, Метапрог-диагарммы в Метапрог онлайн, проект «будильник»).

Из недоделанного: схождения по переключателю (switch) корректно работают только в случае схождения всех без исключения случаев, в том числе «інше»/«другое» (default).

Также заметно, что диагарммы бенчмарков «оплелись» в области поиска подстрок. В прототипе Метапрога работать не очень удобно: есть ограничение на размер окна (если еще увеличить - будут слишком большие задержки отрисовки) и не только, переместить блок входа в цикл по условию (do... while), когда он стал перекрывать вход в типованный цикл (for) было уже довольно сложно (надо переподключать проводки и жесткие последовательности), решил оставить все как есть - все равно работает. В Метапроге «сам на себе», когда он появится, подобных неудобств быть не должно.

В планах: циклы по структурам, переключатели (switch) по многотиповому типу, возможно макросы.

Предыдущая версия: Метапрог-прототип, версия 7 + графические диалоги на Метапроге



Последнее исправление: metaprog (всего исправлений: 7)
Ответ на: комментарий от AntonI

блин я уже и забыл.. месяц авральный какой то…

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

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

fsb400:Пусть у нас есть абстрактный алгоритм с O(n^2) на С который работает на текущих данных так же быстро как хитрый алгоритм на Python c O(nlogn) Но если наши данные увеличатся в 10 раз. То скорость алгоритма на С упадёт в 100 раз, а скорость алгоритма c nlogn упадёт всего в ~30 раз…

metaprog: Ну значит надо на Си или Метапроге делать алгоритм получше, только и всего. Так-то при прочих равных условиях пистон всегда будет сливать.

Метапрог-прототип, версия 6 + будильник на Метапроге (комментарий)

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

Интересно что нынче будет делать ТС?;-)

Начнет генерить в асм, чтоб уж «точно быстрее» ;)

ossa ★★
()

Чего-то вы все рано бенчмарками увлеклись. Лучше бы над языком поработать.

Вот тут анонимус из архива вытащил некий «бенчмарк rand.bmp» — Я ПОСМОТРЕЛ И НИЧЕРТА НЕ ПОНЯЛ! Я в прошлый раз диаграмму понял, потому, что она была хорошо откомментирована. А тут комментариев нет — и ничего нет.

@metaprog, ты говорил, что в текстовых языках надо много переменных объявлять. А у тебя не надо — проводок всунул и всё. Так это, получается, недостаток. Я переменную подумаю, как назвать, и у меня программа без всяких комментариев получается документированной. А с проводками наговнокодить так, что ничерта не будет ясно, гораздо проще, получается.

И я, это, почитать принёс. Не совсем в тему предыдущего абзаца, но тем не менее.

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

Спасибо. То есть памяти он жрет не в пять а в ПЯТНАДЦАТЬ раз больше чем питон. Если ТС научится собирать мусор, будет всего лишь в полтора.

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

Чего-то вы все рано бенчмарками увлеклись.

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

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

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

Он быстро передумал: «Обо всяких там теориях управления сложностью алгоритмов уместно будет говорить тогда и только тогда, когда их выполнение будет предельно быстрым.» (c) @metaprog

Правда есть еще надежда: «Страуструпп отгрохал целый талмуд по ООП. Еще бы, он кандидат наук или как его там. Но я лично считаю эту дребедень лишней и даже вредной. Как говорил Галилей, эксперимент - критерий истины.» (c) @metaprog

Вот поставили эксперимент, в итоге метапрог слил питону в три раза по скорости и в 15 раз по памяти. Может это заставит ТС-а направить свое упорство на самообразование? (звучит как анекдот, да).

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

Чего-то вы все рано бенчмарками увлеклись. Лучше бы над языком поработать.

Потому что ТС то ли сознательно, то ли случайно соврал о том, что его бенчмарк «где-то на уровне С++». Не проверить это высказывание было бы преступно.)

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

«Метапрог я разрабатываю, чтобы быстро и удобно разрабатывать софт, который работает со скоростью чистого Си. Без компромиссов.»(c) @metaprog

AntonI ★★★★★
()

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

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

Качественно сгенеренный код на Си, компилирующийся на разных платформах и ОС (для начала хотябы Линукс, Винда и МакОсь), или какой-то падучий бенчмарк, собственно ничего не доказывающий, т.к. сделан в глючном (надеюсь пока) прототипе. Лично я за первый вариант.

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

Я сначала крутил носом, но потом понял что это ИМНО прекрасная обучающая задача на алгоритмы, работу с памятью и вот это все. Только ее надо бы доработать что бы можно было тестить корректность работы алгоритма.

Но я не возьмусь это оформлять - тут нужен настоящий программист.

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

Только ее надо бы доработать что бы можно было тестить корректность работы алгоритма.

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

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

При десериализации по этому типу определяется версия сохраненного кластера и для устаревших форматов идет соответствующее преобразование в последний.

Т.е. каждая новая версия метапроги будет хранить в себе описания всех предыдущих форматов и функционал (диаграмму?) для преобразования в новый? Или это как-то по другому будет реализовано?

надо еще реализовать свич по многотиповому и цикл по структуре

Вот «цикл по структуре», зачем он нужен? Есть у меня структура struct { int a; char b[10]; float c; }, как этот «цикл по структуре» будет с ней работать?

по сути структуры-макросы

WTF? У тебя нет компилятора, у тебя транслятор в Си, в Си нет такого понятия «структура-макрос».

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

Можно просто сделать свой вариант random-а с большим числом повторов.

Правда что бы добиться детерминизма в многопоточном режиме придется повозиться.

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

Т.е. каждая новая версия метапроги будет хранить в себе описания всех предыдущих форматов

Боюсь она просто будет выкидывать ошибку при попытке загрузить диаграмму не той версии.

Вот «цикл по структуре», зачем он нужен? Есть у меня структура struct { int a; char b[10]; float c; }, как этот «цикл по структуре» будет с ней работать?

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

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

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

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

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

Но я не возьмусь это оформлять - тут нужен настоящий программист.

Ну ладно. Ну хоть и народ порешал задачку на оптимизацию, так сказать, поразвлекался. Пока овчинка выделки не стоит. Вот подождем метапрогу «саму на себе», тогда и опять можно новые бенчмарки предложить.

ЗЫ: тут припоминаю, что метапрог жаловался, что rand() дает постоянные последовательности «случайных» чисел, есть у кого сгенеренный код на Си с использованием rand()? Посмотрите, если есть, srand() в этом коде присутвует?

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

Посмотрите, если есть, srand() в этом коде присутвует?

вот погрепал встроенным поиском в vscode.

https://imgur.com/a/q18z2Fo

В 1000 строках кода, конечно не разбирался, может он там вообще забил на этот rand, и как-то ещё что-то делает…

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

Он говорил, что использовал две реализации генерации случайных чисел, в одном случае rand() из стандартной библиотеки, а в другом какую-то другую функцию, видимо из криптографической, которая давала «истинно случайные числа».

Жалобы были на rand(). Ну если в паре с rand() вначале всего процесса нет типо чего-нибудь srand(time(NULL)), то к чему были все эти жалобы? Последовательность псевдослучайных чисел без случайного seed’a всегда будет одинаковой. Кстати, на заметку, этим свойством пользуются многие игроделы.

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

Ах вот оно что…

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

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

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

Ну скриншот выше действительно «нечитаем» как по мне...

stasolog
()

Что ж, я рад за тебя. Это предел того, что может питон?

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

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

Это предел того, что может питон?

если я прикручу к нему плюсы, то он сможет 0.1 сек. Мне Ваша радость пофик, Вы вспомните что Вы писали о питоне и метапроге и подумайте немножко.

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

Та че там думать, метапроговский бенчмарк надо допиливать - я с самого начала этой темы писал, что он несовершенен. Твоя реализация на С++ использует strncmp, интересно есть ли у этой функции аппаратное ускорение (шарил исходники glibc и видел упоминание SSE).

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

я с самого начала этой темы писал, что он несовершенен.

С самого начала Вы писали:

Метапрог я разрабатываю, чтобы быстро и удобно разрабатывать софт, который работает со скоростью чистого Си. Без компромиссов.

Я на Лабвью прекрасно делаю огромные проекты.

Мне лень гуглить. Я прекрасно программирую на Лабвью и Метапроге, не зная что такое «консистенция».

Императивный, декларативный, функциональный. Lingua Latina non penis canina. Да-да, я прекрасно программирую на Лабвью, не зная значения всех этих заумных словес.

Как итог - слив питону в три раза.

Твоя реализация на С++ использует strncmp, интересно есть ли у этой функции аппаратное ускорение

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

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

То есть грибоэлектричество не позволяет осознать что такое локальность данных? Дианочка, Вы пробили очередное дно!

Ну и кстати, врать не хорошо - где там кроме strcmp еще функции написанные с применением асм и чего только можно? rand и std::vector::resize? Дианочка, Вы по прежнему брешете как дышите.

А уж если в питоновскую реализацию заглянуть - вот где сплошной ассемблер та!

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

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

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

Да не интересны мне эти бенчмарки, я на вопрос отвечал просто.

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

я с самого начала этой темы писал, что он несовершенен.

С самого начала ты писал, что он «на уровне С++». Мы ждем извинений за обман.

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

Очевидно что нет вот одна из реализаций https://code.woboq.org/userspace/glibc/string/strncmp.c.html вот побольше из разных реализаций одного и того же https://www.systutorials.com/strcmp-and-strncmp-implementation-in-glibc/

Если мне не изменяет память из аппартной поддержки хешей вроде есть какие-то инструкции для crc, семейству sha https://en.wikipedia.org/wiki/Intel_SHA_extensions и вроде aes, но я могу и ошибаться.

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

Вся эта инфа легко гуглится, почитайте на досуге.

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

Тут не все платформы, но многие с этим соглашусь. Ну и конечно лучше бы прямо ссылки на файлы, а не на директорию в общем. Кстати да речь шла о strncmp, а не о strcmp, могу согласиться что разница не большая, но как бы она есть.

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

Вся эта инфа легко гуглится, почитайте на досуге.

Не в коня корм. Диана с пеной у рта будет доказывать что бенчи коварных антиметапрогеров юзают asm (в strcmp, который занимает меньше 1% общего времени) и fopenmp (для замера интервалов времени) и потому они порвали бедный метапрог. Особенно на питоне. Это типичное поведение троллей - перевод стрелок.

Ну а ТС уже все сказал: «Мне нужно чтобы на мои вопросы отвечали прямо. Никаких посыланий к гуглу, книгам и прочего подобного бреда.» @metaprog Я боюсь что на ЛОРе он может биться фейсом об тейбл сколько угодно - что бы понять что его подход бесперспективен ему таки надо приложиться в реальной жизни раза так три-четыре. И то не факт что дойдет…

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

Где-то есть где-то даже strcmp нет, посмотрите внимательно например arm там только в v7 есть что-то похожее. В общем целом как и всегда прелести аппаратной поддержки чего-либо.

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

Оставьте уже эти бенчмарки в покое. Ясно, что пока ТС не осилит оптимизацию генерируемого кода, а это предварительный этап перед самой генерацией, требующий уже гораздо больше усилий (и имхо, знаний, но возможно ТС справится и так), пока не научится «в алгоритмы», бенчмарки в разы будут сливать сишке и плюсам.

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

В разы они будут сливать питону, плюсам они сливают на два порядка.

Вы не помните предыстории - что ТС говорил о плюсах, питоне, алгоритмах, «матане» и пр. Пока ТС не осознает свои ошибки и не начнет учится толку никакого не будет, а чем сильнее его будут бить по лицу теми же бенчмарками тем больше шансов что это вообще хоть когда то произойдет. Хотя я в то что это произойдет не верю.

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

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

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

Оставьте уже эти бенчмарки в покое

Как только @metaprog извинится за вранье, на котором его поймали, я сразу забуду про этот бенчмарк. Обещаю)

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

О, да это же тот самый, знаменитый спагетти-код! Стоит отдать должное метапрогу за кропотливый труд по его визуализации.

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

В разы они будут сливать питону, плюсам они сливают на два порядка.

Как я понял (за тредом не следил) метапрог по бенчмаркам оказался ещё той сранью?

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

Да, там трындец - питону он слил в три раза по скорости и в 15 раз по памяти (если ТС асилит сборку мусора то будет всего лишь в 1.5 раза по памяти).

Плюсам в 40 раз по скорости и в туеву хучу раз по памяти.

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