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)
Ответ на: комментарий от metaprog

Локальный форк и копипаст - это не то же самое.

В чём разница?

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

А можно было бы иметь одну диаграмму бенчмарка, и туда просто передавать функцию для генерации случайного числа. Тогда можно не делать копии/форки бенчмарка, а запустить бенчмарк с rand, а потом запустить тот же самый бенчмарк с randombytes_uniform. Это если, конечно же, есть метапрогоаммирование.

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

Это если, конечно же, есть метапрогоаммирование.

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

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от ma1uta

Фууу, матан какой ты предлагаешь! Ещё скажи, что можно один рисунок для разных типов использовать. Нет, только копипаст, только хардкор.

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

Да, наверное в этом дело. Еще поспрошаю у компетентных коллег.

Переделал структуру данных на односвязный список что бы ходить «по шерсти», в один поток выигрыш почти вдвое

$ ./bench
generate strings 0.0815278 sec
generate hash 1.14169 sec
search time 0.00112064 sec
total time 1.22433 sec
 matches 0

$ g++ -std=c++11 -O3 -Wall -o bench2 -fopenmp bench2.cpp
$ ./bench2 
generate strings 0.0805417 sec
generate hash 0.644342 sec
search time 0.00160707 sec
total time 0.726491 sec
 matches 0

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

ИМНО это предел - быстрее уже не получится.

Но Диана обвиняет меня в читерстве - дескать я OpenMP использую. В однопоточной версии!!! Коварство антиметапрогеров не знает границ…

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

я забыл сколько у Вас получалось на Ъ плюсах с unordered_set.

Ну возможно на linux ваша версия будет и быстрее, но под Windows студией она не собирается, так как используются Posix функции: random и rand_r, а cygwin нереальный тормоз…

https://imgur.com/a/gPbRVIl

моя версия: https://pastebin.com/gbAp1c9r

Кстати, ещё один пример метапрогу, про кроссплатформенность С/С++ :)

И мою версию на Linux не получается собрать у ТС, и ваша и @i-rinat версия на Windows лишь cygwin собирается…

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

Ещё скажи, что можно один рисунок для разных типов использовать.

Дык у них есть СУВТ - зачем им разные типы?! Надыть еще сделать СУВД (система управления выбором диаграммы) и тогда будет одна диаграмма на все случаи жизни! Тем более что в жизни метапрогера всего то три варианта - будильник, разворот строки, бенчмарк.

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

Ваша версия у меня не собиралась из за execution.

Кстати, я так понял она у Вас параллельная? С однопоточным исполнением сравнивали?

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

Кстати, я так понял она у Вас параллельная? С однопоточным исполнением сравнивали?

параллельное заполнение массива случайными строками. Хеши однопоточные. Если убираю параллельные stl алгоритмы, то падает до ~6 секунд.

Ваша версия у меня не собиралась из за execution

тоже gcc8?

На 9 должно собираться.

https://gcc.godbolt.org/z/fos-to

На 8 тоже должно, но нужно самому собрать какую-то реализацию parallel stl: https://github.com/intel/parallelstl или эту: https://github.com/STEllAR-GROUP/hpx

К сожалению для metaprog, этих stl нет в пакетах debian:

https://repology.org/project/hpx/versions

https://repology.org/project/pstl/versions

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

У меня на ноуте вообще какой то древний гцц,в институте восьмой.

Ну там как раз хэши самое долгое…

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

А настоящее метапрограммирование

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

ТС почему-то обожествляет форму представления и считает, что «текстовое программирование» и «графическое программирование» — это два разных программирования. Соответственно, теорию читать не хочет, поскольку она же делалась для «текстового программирования». Хотя если подумать…

hobbit ★★★★★
()

https://imgur.com/li5yqat

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

Для игрульки какой может и сгодится.

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

Я на этой картинке вижу одновременно говно и МПХ.

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

нет, это из архива, что в шапке прицелен. «бенчмарк rand.bmp»

anonymous
()
Ответ на: комментарий от anonymous
deb@ulius-vm:~/metan$ clang rand.c -o test -O3 -s -lm -DNKCD=NKC_SDL  -I/usr/include/SDL2 -lSDL2 -DNKC_USE_OPENGL=NGL_ES2 -lGLESv2 -lSDL2_net -lSDL2_mixer `pkg-config --cflags sdl2` -lsodium
In file included from rand.c:44:
./tinyfiledialogs/tinyfiledialogs.c:91:9: warning: '_POSIX_C_SOURCE' macro redefined [-Wmacro-redefined]
#define _POSIX_C_SOURCE 2 /* to accept POSIX 2 in old ANSI C standards */
        ^
/usr/include/features.h:266:10: note: previous definition is here
# define _POSIX_C_SOURCE        200809L
         ^
rand.c:957:1: warning: expression result unused [-Wunused-value]
!(metaprog_instance_0_64856303621910529_2279812593437575169_1236008087594752001_4068640843849750529__connection_1018931311);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
rand.c:997:1: warning: expression result unused [-Wunused-value]
metaprog_instance_0_64856303621910529_2279812593437575169_6593913843351961601_4741583324462761985__structure_constant_9116135767490078721_0;
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
rand.c:999:1: warning: expression result unused [-Wunused-value]
metaprog_instance_0_64856303621910529_2279812593437575169_6593913843351961601__structure_constant_8803677800306536449_0;
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

........ 120 lines skipped .........

rand.c:721:1: warning: expression result unused [-Wunused-value]
metaprog_instance_0_64856303621910529_2984421456141588481__function_return_5795591909695571969;
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
44 warnings generated.
deb@ulius-vm:~/metan$ ./test 
0
849
22
8539
1
Segmentation fault (core dumped)
deb@ulius-vm:~/metan$

леее, это г-но еще и крешится.

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

лол. Крешится пару-тройку раз из 10 запусков. на разных итерациях.

0
739
20
Segmentation fault (core dumped)
0
849
22
8539
1
1035
41
Segmentation fault (core dumped)
anonymous
()
Ответ на: комментарий от anonymous

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

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

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

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

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

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

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

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

Да нет не стыдно. Зачем ютуб захламлять. Ничего интересного ты не пропустил. Там только мои попытки понять всю прелесть Labview. Увы безуспешные.

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

сейчас уже наверное трудно восстановить хронологию событий того кто в MS занимался разработкой BMP формата, но думаю там тоже люди с какими-нибудь ученными степенями присутствовали :)

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

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

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

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

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

У меня разница меньше выходит, новый бенч:

~/tmp/mp » time ./bench2                                                                                       generate strings 0.0478581 sec
generate hash 0.0698124 sec
search time 0.000662665 sec
total time 0.118333 sec
 matches 0
./bench2  0,11s user 0,02s system 99% cpu 0,133 total

Сравнил среднее время выполнения на 10 запусках, вышло 0.151s vs 0.123s

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

лол. Крешится пару-тройку раз из 10 запусков. на разных итерациях.

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

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

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

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

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

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

UB

При определенном вводе твой «будильник» громко падает в корку.

Надеюсь, молотком по голове ты себя не бьешь? Или, например, пальцы в розетку?

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

Да про дистро забыл. Да Manjaro.

Собралось. Спс.

Вот твою программу я могу собрать даже будучи нубасом. А чудо будильник никак.

Razk
()
Ответ на: UB от anonymous

Посоны, у нас тут сениор архитектор 80лвл! Всем бояцца!

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

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

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

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

Он просто смотрит на диаграмму и чувствует где ошибка! Если не чувствует, то продолжает смотреть пока не почувствует… или рисует новую диаграмму.

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

А куда деватся то :) Кроме Лора никто чудо творение походу не оценил.

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

Ненене, больше, чем уже, я на тот ресурс тратиться не собираюсь.

И да, я что-то пропустил, но с каких пор Мегапрогеру привиделось, что Java — это тоже скриптуха?

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

Так у него всё скриптуха. Я готов поспорить, что он не сможет внятно объяснить, чем отличается компилятор от интерпретатора.

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

И да, я что-то пропустил, но с каких пор Мегапрогеру привиделось, что Java — это тоже скриптуха?

У него две категории текстовых ЯП: C и скриптуха.

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

потому что:

-медленная

-жрет память

-эксепшены

Собственно по этой же причине и все остальные ЯП

Ну и самое главное - там везде ООП

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

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

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

Если я забодяжу, или найду реализацию эксепшенов для си, то си станет скриптухой в терминологии метапрога? Кстати, есть механизмы, например, abrtd, срать в консоль и логи бэктрейсами от сишных программ, си теперь скриптуха?

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

Скорее всего типичный представитель «нескриптухи» это бейсик, причем тот, настоящий, Dartmouth BASIC.

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