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

Так там нет кода. А тот, что есть, автоматически сгенерирован, пихать его в систему контроля версий смысла нет никакого. Нужно попросить у @liksys завести файлопомойку на metaprog.org.

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

Нужно музыкальное сопровождение.

Да я не заморачивался. Набрал no copyright music и в путь. Всеравно удалю через пару дней.

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

Чет ты я смотрю вообще обезьянишь в Лабвью. Исходники там явно не для тебя. Бинарный Метапрог запустить осилил?

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

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

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

А тот, что есть, автоматически сгенерирован, пихать его в систему контроля версий смысла нет никакого

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

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

Я пытался честно разобраться. Оказалось все не так просто как ты рассказывал. Поставить DevCpp, набрать код и нажать compile+run намного проще чем в той каше разобраться. Это мое мнение. Зато твоя отговорка про «не смотрели но критикуете» не работает. Вот посмотрел взглядом новичка. С для чайников проще.

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

Чет ты я смотрю вообще обезьянишь в Лабвью

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

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

А так чтоб кнопкой?

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

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

Да нафиг надо оно мне, пусть комплект сделает автор для сборки под винду. Я скомпилю и потестирую без проблем. А так проще в SDL с нуля разобраться, чем в том что он там в исходниках наинклудил XD. И так половину инклудов закоментил.

Razk
()

Запустил бенчмарк под валгриндом. Эмм…

==31621== HEAP SUMMARY:
==31621==     in use at exit: 2,392,720,864 bytes in 2,020,042 blocks
==31621==   total heap usage: 2,020,086 allocs, 44 frees, 2,392,722,200 bytes allocated
==31621== 
==31621== LEAK SUMMARY:
==31621==    definitely lost: 2,130,483,064 bytes in 1,010,016 blocks
==31621==    indirectly lost: 100,198,100 bytes in 1,009,981 blocks
==31621==      possibly lost: 162,038,836 bytes in 43 blocks
==31621==    still reachable: 864 bytes in 2 blocks
==31621==         suppressed: 0 bytes in 0 blocks
==31621== Rerun with --leak-check=full to see details of leaked memory
provaton ★★★★★
()
Ответ на: комментарий от Razk

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

Лови нормальный обзор: https://youtu.be/EcQMgUAm0DE

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

Тихо, он пока ещё не знает, что такое утечка памяти. Он пока на уровне развития, когда «утечка» - это маленькая утка и не более.

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

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

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

дак это как бы не утечка.. это черная дыра просто

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

Утечки в бенчмарке особого значения не имеют. Там нет free (я с этим не заморачивался), все равно все освобождается по завершении программы.

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

Это звучит почти так же как «Все равно я когда выключаю компьютер вас нет.» А вообще это довольно показательный пример насколько удобно программирование с ручной аллокацией и деаллокацией памяти.

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

«Все равно я когда выключаю компьютер вас нет.»

Нажал turnoff и антиметапрогеры исчезли. Жаль из головы ТС они не исчезнут никогда.

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

Реализация банальных вещей путём накликивания ахинеи на сто экранов, видимо, не вдохновляет даже самого автора

я с этим не заморачивался

ЧиТД.

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

+1. Интересно почему не говорят о том что ты забыл закрыть stdout, stdin, утечка же!

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

Свой ВЦ будет пилить, с диаграммами и жгутиками.

provaton ★★★★★
()

Пока что тест получился в целом неважнецкий, где-то на уровне С++.

Ты уверен? Я запустил у себя rand.c (скомпилированный с -O3):

./rand  40,20s user 0,54s system 99% cpu 40,800 total

Запустил для сравнение один из самых медленных вариантов (питоновский без распараллеливания):

~/tmp/mp » time python test.py                                                                           
generated haystacks in 7.12 secs
found 0 needles in 26.79 secs
python test.py  33,39s user 0,52s system 99% cpu 33,958 total

Сишный бенчмарк у меня отрабатывает за:

./test-c  10,46s user 0,00s system 99% cpu 10,488 total
provaton ★★★★★
()
Ответ на: комментарий от metaprog

Там нет free (я с этим не заморачивался),

то есть ты и тут врешь, что твой код «на уровне С++», ибо там освобождение есть.

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

царь не про это говорил это раз. Два - ни ты, ни второй поехвший не программисты, чтоб что-то там с царя слушать. хеловорд сначала на своей поделке осильте, чтоб оно не текло и не падало, «разработчики», ле :D

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

Я запустил у себя rand.c

ты просто хейтер и антиметапрогер!!!111 У метапрогреров (у всех полутора) оно быстрее

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

У них либо особое железо и компилятор, метапроговские. Либо буйная фантазия.

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

царь не про это говорил это раз

НЕ МОЖЕТ ЭТОГО БЫТЬ

хеловорд сначала на своей поделке осильте, чтоб оно не текло и не падало, «разработчики», ле :D

УМВР, криворуки не интересуют

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

С донатом. Всё по канонам. Таким образом проект достигнет своей цели по монетизации.

anonymous
()

Капец, какие ж убогие эти ваши схемы. Где вход? Почему их несколько? В чем различие этих разных входов? Какие скопы у объектов? Как контролируется жизнь всех элементов? Ручной фрии это конечно полный абзац. Простые задачи выглядят как оверкомпликейтное решение индусов.

Если задача отпугнуть от графического программирования - то задача полностью выполнена. От этих схем тянет блевать.

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

Входами являются все константы и квадратики у которых нет входных зависимостей. Так вот все прекрасно…

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

Где вход?

Какой вход? Первый исполняемый блок? В начале схемы очевидно... У него нету входов, и обычно он распологается слева.

Почему их несколько?

Кого? Схем? А должна быть? Одна?

Или первых исполняемых блоков? Он может быть только один...

Какие скопы у объектов?

Их нету в обычном понимании.

Как контролируется жизнь всех элементов?

Можно создавать объект, можно не создавать, можно освобождать, можно не освобождать...

Ручной фрии это конечно полный абзац.

GC мы уже обсуждали.

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

Как хентай с тентаклями, только лучше :3

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

Да и си ничего так, если постараться.

 		    #define/**/X
		  char*d=«X0[!4cM,!»
	       «4cK`*!4cJc(!4cHg&!4c$j»
	     «8f'!&~]9e)!'|:d+!)rAc-!*m*»
	   ":d/!4c(b4e0!1r2e2!/t0e4!-y-c6!"
	  «+|,c6!)f$b(h*c6!(d'b(i)d5!(b*a'`&c»
	  ")c5!'b+`&b'c)c4!&b-_$c'd*c3!&a.h'd+"
	 «d1!%a/g'e+e0!%b-g(d.d/!&c*h'd1d-!(d%g)»
	«d4d+!*l,d7d)!,h-d;c'!.b0c>d%!A`Dc$![7)35E»
       "!'1cA,,!2kE`*!-s@d(!(k(f//g&!)f.e5'f(!+a+)"
       «f%2g*!?f5f,!=f-*e/!<d6e1!9e0'f3!6f)-g5!4d*b»
       «+e6!0f%k)d7!+~^'c7!)z/d-+!'n%a0(d5!%c1a+/d4»
       "!2)c9e2!9b;e1!8b>e/!     7cAd-!5fAe+!7fBe(!"
      «8hBd&!:iAd$![7S,Q0!1     bF 7!1b?'_6!1c,8b4»
      "!2b*a,*d3!2n4f2!${4    f.      '!%y4e5!&f%"
     «d-^-d7!4c+b)d9!4c-a    'd        :!/i('`&d»
     ";!+l'a+d<!)l*b(d=!'   m-        a  &d>!&d'"
    «`0_&c?!$dAc@!$cBc@!$   b         <    ^&d$`»
    ":!$d9_&l++^$!%f3a'    n1        _       $ !&"
   «f/c(o/_%!(f+c)q*c     %!         *       f &d+»
   «f$s&!-n,d)n(!0i-     c-         k)       !  3d»
   «/b0h*!H`7a,![7*     i]          5        4   71»
  «[=ohr&o*t*q*`*d      *v         *r         ;  02»
  «7*~=h./}tcrsth      &t          :          r   9b»
 «].,b-725-.t--//      #r         [           <   t8-»
 «752793?  <.~;b      ].t--+r     /           #    53»
 «7-r[/9~X  .v90      <6/<.v;-52/={            k   goh»
 "./}q;   u  vto     hr  `.i*$engt$            $    ,b"
 ";$/     =t ;v;     6     =`it.`;7=`          :    ,b-"
 «725    = / o`.    .d       ;b]`--[/+       55/     }o»
 «`.d   :   - ?5    /           }o`.'     v/i]q      - »
 "-[;   5  2  =`  it            .        o;53-       . "
 «v96   <7 /      =o            :            d        =o»
 "--/i  ]q--      [;           h.            /        = "
 «i]q--[  ;v      9h           ./            <        - »
 «52={cj   u      c&`          i   t       . o        ; »
 "?4=o:d=         o--          /  i        ]q         - "
 "-[;54={  cj     uc&          i]q          -          -"
 «[;76=i]q[;6     =vsr        u.i           /          ={»
 «=),BihY_gha     ,)\0        »             ,          o [
  3217];int i,   r,w,f        ,              b        ,x ,
  p;n(){return   r  <X        X               X       X  X
  768?d[X(143+   X  r++       +               *d      )  %
   768]:r>2659   ?  59:       (                x      =  d
   [(r++-768)%   X  947      +             768]       ) ?
   x^(p?6:0):(p  =   34      X            X           X )
   ;}s(){for(x=  n   ();     (           x^           ( p
  ?6:0))==32;x=  n    ()     )   ;return x            ; }
  void/**/main X      ()     {           r           =  p
  =0;w=sprintf  (X     X     X         X X           X o
  ,«char*d=»);  for          (    f=1;f <            * d
  +143;)if(33-(  b=d         [      f++ X           ]  )
  ){if(b<93){if   X(!        p          )             o
   [w++]=34;for    X(i       =         35             +
    (p?0:1);i<b;    i++      )         o
    [w++]=s();o[     w++               ]
     =p?s():34;}     else              X
       {for(i=92;     i<b;            i
	++)o[w++]=     32;}           }
	     else o     [w++          ]
			 =10;o        [
			   w]=0      ;
			    puts(o);}
gremlin_the_red ★★★★★
()

А бенчи по скорости разработки будут?

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

Какой вход?
Кого? Схем? А должна быть? Одна?

Не строй из себя валенка.

Вот ваш будильник https://imgur.com/dwyUT83. Тут https://imgur.com/MKJsJJn например, можно предположить, что вход это стрелочка, но не факт.

У него 3 массива и 3 константы. Что из них вход? И вообще вход ли это?

Их нету в обычном понимании.

Ну ох..ть теперь. Схема есть, вход, ладно хрен сним, тоже есть, выход, стало быть тоже, а скопа нет?

Можно создавать объект, можно не создавать, можно освобождать, можно не освобождать…

Можно копать, можно не копать…Кстати в этом же будильнике я вижу что-то типа Х https://imgur.com/ltWeLgM уто удаление? то есть free? где на схеме malloc, который есть в коде? Он неявный? А как оприделить, что он произошел тогда?

GC мы уже обсуждали.

причем тут GC? Вышел за скоп - дропнул ресурс. Иначе это какая-то совсем порнография полуается на уровне перфокарт

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

Хотя ясно-понятно, что эти вопросы не к тебе. Ты просто демагог и тролль. Это вопросы скорее к «хению», который всю эту йобу начал.

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

Не строй из себя валенка.

Это к тебе относится, мог бы прочесть туториал. По твоему несколько входов исполняются параллельно или как? (естественно вход только один, но ты предпологал что их есть несколько)

У него 3 массива и 3 константы. Что из них вход? И вообще вход ли это?

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

Ну ох..ть теперь. Схема есть, вход, ладно хрен сним, тоже есть, выход, стало быть тоже, а скопа нет?

Нету. Считай что все переменные в глобале и статике, но это не так конечно.

Кстати в этом же будильнике я вижу что-то типа Х

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

где на схеме malloc, который есть в коде?

Где то есть. Явный. Тебе его показать что ли надо?

причем тут GC? Вышел за скоп - дропнул ресурс.

Скопа нету.

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

Это к тебе относится, мог бы прочесть туториал.

Туториал? Читать макулатуру? Совсем поехавший чтоль? Я не читать, а программы писать!

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

шта?

По моему это песочные часы, разве нет? Наведи на этот блок мышь

нах мышь! Все долдно быть очевидно, ведь это графическое программирование!111

Где то есть. Явный. Тебе его показать что ли надо?

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

Скопа нету.

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

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