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

Каждый день я мета-тредик
мета-тредик охранял
Месяц, два, и год, мета-тредик охранял

А на ЛОРе и на Хабре
выбирают лишь говно
любит наш народ
скриптушное говно

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

Честно признаюсь, я забил. Вернее я попытался котеечка, но заявленного уровня который я обещал у меня не вышло. Считай что ё слилсо =) Я всё ещё хочу что-то просто красивое сделать. Но пока я продолжаю больше сам двиг колупать чем иное так и буду просто хотеть =) А дров наломал внутри ого-го короче ой, пока разгребу пенсионерами станем.

P.S. Но если таки рожу, я отпишу =) Отпишу я у себя в профиле ибо ты раз в полгода реинкарнацию делаешь.

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от stasolog

А, ну тогда если сделаю то выложу в любом случае там.

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

ТС тупо нагло врет, что его бенчмарк по скорости как бенчмарк на плюсах (который лишь слегка уступал бенчмарку на сишке)…

Ослоумие антиметапрогеров удивляет. Они сами себя множат на ноль.

Итак, на основании измерения времени выполнения бинарника и питоноскрипта

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

ты утверждаешь, что метапроговский бенчмарк медленнее питона. Врешь. Да, полное время выполнения метапроговского бенчмарка больше (40 секунд против 33), но это время включает в себя 10 (ДЕСЯТЬ) повторений теста, что было прямо оговорено в изначальной задаче:

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

Для чистоты эксперимента запускаете тест 10 раз

Во всех тестах на питоне - только ОДНО повторение вместо десяти. Если считать по одному повторению теста, а не десяти, на ОДНО повторение у метапроговского бенчмарка 4 (ЧЕТЫРЕ) секунды, но чтобы это понять надо уметь смотреть диаграммы, читать описание теста и делить на 10 - видимо, это ядреный матан, непостижимый уму антиметапрогеров.

Сишный бенчмарк у тебя занял 10 секунд, но он тоже включает 10 повторений теста, то есть на одно повторение - одна секунда, в 4 раза быстрее. Да, бенчмарк на Метапроге не помешало б еще доработать, о чем я прямо написал в заголовке темы.

Но если сравнивать с плюсами, то метапроговский бенчмарк находится примерно на равных. У меня одно повторение теста с генерацией случайных числе на rand тоже занимает примерно 4 секунды, а повторение бенчмарка на С++ занимает около 7-8 секунд. Я не говорю об опережении С++, поскольку сравниваю с плюсовым бенчмарком без хешей (а у меня хеши). Плюсовый бенчмарк на хешах мне собрать еще не удалось ( fsb4000 или кто еще дайте плиз командную строку для компиляции под линуксом либо скомпильте у себя метапроговский бенчмарк и сами сравните с плюсами), но есть сведения, что он быстрее только в 2 раза: Метапрог-прототип, версия 7 + графические диалоги на Метапроге (комментарий)

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

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

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

У тебя даже будильник валится и течет, и ты утверждаешь, что у тебя там что-то работает. «не верю» (с)

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

докажи, что твоя имплиментация в точности выполняет условия задачи, а не просто рандомно что-то проверят с чем-то

Есть тесты с меньшей длиной подстроки 3 и 5, они показывают что если вхождения есть - они выводятся корректно.

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

У тебя даже будильник валится и течет

Утечки-то еще могут быть, но что надо делать, чтобы он именно валился?

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

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

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

Трансляции тестов выложены вместе с бенчмарком, так что не перди.

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

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

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

Трансляции тестов выложены вместе с бенчмарком

И что думаешь кто-то будет эту фекаль разбирать?

Я таки подумываю закрывать свои темы от анонов

правда неудобная, да? молодец, обдристал портки и типа незаметно.

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

fuzz-testing, узнаешь

щас ему его пiдсрачнiк расскажет что это такое. посмотрит в вики и расcкажет, но хений один хрен этого ниосилит.

anonymous
()

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

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

Как? По какой методике? Какой программой?

Fuzz-testing это и есть методика. Программу оставляю на твое усмотрение.

И не забудь ответить на это

Твой самый быстрый бенчмарк с «ненастоящими» случайными числами (rand.c) сливает сишке в ЧЕТЫРЕ раза. Ты сам это признал. Ок.

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

Еще я пропустил момент, что в питоне и си реализация без хешей. То есть, твоя реализация с хешами сливает в РАЗЫ самой стрейтфорвард реализации на С. Но обгоняет совершенно неоптимизированную программу на питоне, ок.

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

provaton ★★★★★
()

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

Это просто праздник какой-то…

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

однопоточная питоновская (python2) реализация с хэшами

#!/usr/bin/python

import sys, random, time
s0 = ''.join(map(chr, range(97,123)))

r100, r20, r80 = range(100), range(20), range(20, 100)

t0 = time.time()
stable = [''.join(s0[int(random.random()*26)] for j in r100) for i in xrange(100000)]
t1 = time.time()
print 'generate strings', t1-t0

htable = {}
for I in xrange(len(stable)):
    s, h = stable[I], 0
    for k in r20: h |= ord(s[k])%2<<k
    for i in r80:
        htable.setdefault(h, []).append((I, i-20))
        h >>= 1; h |= ord(s[i])%2<<19
t2 = time.time()
print 'generate hash', t2-t1, len(htable), 0xfffff

matches = 0
for i in range(1000):
    h, s = 0, ''.join(s0[int(random.random()*26)] for j in r20)
    for k in r20: h |= ord(s[k])%2<<k
    for k, off in htable.get(h, []): matches += s==stable[k][off:off+20]
t3 = time.time()
print 'search time', t3-t2
print 'total time', t3-t0

print  'matches', matches

проц Intel(R) Core(TM) i5-6200U CPU @ 2.30GHz

$ ./bench.py
generate strings 2.64825701714
generate hash 9.09323906898 1048093 1048575
search time 0.0179228782654
total time 11.7594189644
matches 0

один проход. Т.е. метапроговская реализация обгоняет мерррскую скриптуху всего лишь в три раза?! Ща на плюсах сделаю, если не лень будет.

AntonI ★★★★★
()
Последнее исправление: AntonI (всего исправлений: 1)
user@2f2ea8dbe8b2:/tmp$ 
user@2f2ea8dbe8b2:/tmp$ md5sum rand.c 
20c7549db796c1c7dfa103c6f5fe1f31  rand.c
user@2f2ea8dbe8b2:/tmp$ time gcc rand.c -lm -g -O2 `pkg-config --cflags --libs SDL2_mixer libsodium libevent sdl2 gl` 
In file included from rand.c:54:
tinyfiledialogs/tinyfiledialogs.c:91: warning: "_POSIX_C_SOURCE" redefined
   91 | #define _POSIX_C_SOURCE 2 /* to accept POSIX 2 in old ANSI C standards */
      | 
In file included from /usr/include/x86_64-linux-gnu/sys/types.h:25,
                 from /usr/include/x86_64-linux-gnu/SDL2/SDL_stdinc.h:34,
                 from /usr/include/SDL2/SDL_mixer.h:25,
                 from rand.c:14:
/usr/include/features.h:266: note: this is the location of the previous definition
  266 | # define _POSIX_C_SOURCE 200809L
      | 

real	0m12.247s
user	0m11.802s
sys	0m0.368s
user@2f2ea8dbe8b2:/tmp$ ./a.out 
0
414
110
Segmentation fault (core dumped)
user@2f2ea8dbe8b2:/tmp$ 
i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

и тут кора? Да штотыбудешь делать! Это наверняка SDL виноват. Или rand() или вообще ядро, потмоу что на старом Си написано каким-то студентом. точно-точно, что ж ещё то! Не метапрог же.

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

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

лол.

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

Ничего, можно собрать и gcc, но нужен incl.xml сгенерированный под gcc.

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

У меня даже под WSL заработало.

$ time ./rand
real    1m9.472s
user    1m6.031s
sys     0m3.266s

$ python2 ./rand.py
generate strings 2.79490804672
generate hash 13.7305169106 1048066 1048575
search time 0.0243940353394
total time 16.5498189926
matches 0

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

однопоточная версия

$ g++ -std=c++11 -O3 -Wall -o bench -fopenmp bench.cpp
$ ./bench
generate strings 0.10222 sec
generate hash 1.13756 sec
search time 0.00106369 sec
total time 1.24084 sec
 matches 0

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

$ g++ -std=c++11 -O3 -Wall -o benchP -fopenmp benchP.cpp
$ ./benchP
generate strings 0.0304989 sec
generate hash 0.627052 sec
search time 0.00173967 sec
total time 0.659291 sec
 matches 0

в четыре потока, один проход и там и там.

Генерация строк ожидаемо ускоряется почти на 100%, а вот генерация хэшей memory bound судя по всему, и при распаралливании накладные расходы на блокировки (я честно говоря сделал ооочень грубо, в лоб), поэтому ускорению чуть больше чем вдвое. Я гонял на Xeon E5-2690 v4 в 28 (не уверен) тредов - там общее время полсекунды, ускорение чуть лучше чем вдвое по сравнению с одним потоком. Можно попробовать каждому треду дать свою таблицу на заполнение и потом их слить, или заюзать какую то блочную оптимизацию, только я не соображу какую - поганая задача для распараллеливания.

@fsb4000, я забыл сколько у Вас получалось на Ъ плюсах с unordered_set. Но то что метапрогомать Диана чуть выше запостила - ихняя жгутиковая метапрога с хэшами на Ъ сях ожидаемо слила богомерзким плюсам в ПЯТЬ раз (на самом деле больше - у Дианы проц похоже медленнее).

Перефразируя Коровьева: «Читаемость кода хрясь в никуда, производительность хрясь в пять раз, закачка почитай сотни метров весит - вот до чего эти СУВТ-ты доводят!»(c) ;-)

ТС, я не буду приводить Ваш предыдущий бред о плюсах, но если будете убиваться - делайте это об угол шоб сразу.

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

Для референса на моей машине (Core i7 8700K):

Однопоточная реализация на хешах от АнтонИ:

~/tmp/mp » time ./test-cpp                                                                                     
generate strings 0.0480122 sec
generate hash 0.10188 sec
search time 0.000468725 sec
total time 0.150361 sec
 matches 0
./test-cpp  0,14s user 0,02s system 99% cpu 0,159 total

rand.c от ТСа:

~/tmp/mp » time ./rand                                                                                         
0
205
10
3742
1
194
9
3772
2
194
9
3796
3
194
10
3779
4
194
10
3763
5
197
10
3755
6
193
10
3762
7
192
10
3775
8
194
9
3756
9
195
10
3741
./rand  39,16s user 0,52s system 99% cpu 39,739 total

Итого 0.159s vs 3.973s или практически ровно 25 раз. Я не буду торопиться с ироничными комментами, может в бенче Антона найдется бага (я слишком хочу спать чтоб ревьюить код прям сейчас).

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

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

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

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

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

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

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

Херасе, что у Вас за машина?:-)

Intel(R) Core(TM) i7-8700K CPU @ 3.70GHz, 32GB RAM, частоту оперативки не помню. Другие части вроде не задействованы?

А в коде ТСа багов нет?:-)

Как вы посмели :/

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

Там доступ к памяти задействован, интересно что за память. Но в общем да, понятно, спасибо… я то на ноуте считал.

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

Как вы посмели :/

Виноват. Диаграмм-ревью проводится исключительно членами союза художников (@DELIRIUM молчать!:-)) исключительно с эстетической точки зрения.

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

Там доступ к памяти задействован, интересно что за память.

Память Kingston DDR4 SDRAM, 3200Mhz, две планки по 16ГБ.

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

Кстати, Мегапрог, создавать виртуалов в каждом треде (котечка, стасолох и проч.) - моветон, палишься

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

Причем, всегда одинаково. Типо гордый Мегапрог и чел. который его защищает-помогает-рассказывает юзерам-как-правильно-все-делать

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

Nick: stasolog ID: 174922

Дата регистрации: 31.01.20

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

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

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