LINUX.ORG.RU

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

 , ,


1

3

Наконец-то настало время для первой прикладной программы на Метапроге - будильника. Чтобы правильно его собрать, нужна последняя версия прототипа Метапрога. Архив включает в себя исходные диагарммы на LabVIEW и скомпилированные exe, которые можно запустить под Wine на линуксе, читайте инструкции из архива с названием вашего языка. Скачать:

https://www24.zippyshare.com/v/xEn1RKAG/file.html

Основная причина выпуска 6 версии - исправление бага с жесткими последовательностями, ведущими к началу цикла. Это исправление вряд ли окончательное, но для трансляции диагарммы будильника сойдет. Если после транслятора из 5 версии прототипа Метапрога сообщение о времени будильника выводилось в цикле каждый раз, то тут - только один раз, в самом начале:

https://i.postimg.cc/QM43XMjf/image.png

Также проект может похвастаться тем, что функцию проигрывания звукового файла в своей основе сделал insw, успешно разобравшись с функционалом прототипа Метапрога. Я лишь добавил дебаги с условными разветвлениями (аналог if...else) и жесткими последовательностями. В получаемом из транслятора сишном коде это выглядит как множество вложенных друг в друга if...else. Проигрывание звука:

https://i.postimg.cc/d0d2FhRY/image.png

Сишная трансляция диаграммы будильника (не забудьте sound.wav!):

https://pastebin.com/YAd4J1SN

Почему будильник на константах? С графическим вводом значений пока проблемы: всплыли новые баги с «умными массивами». Исправление будет в будущих версиях. Но в этой версии исправлено несколько других багов: теперь не должно быть проблем с заданием типа массива и индикаторы прогресса закрываются сами после завершения операции.

Переворот массива

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

Диагармма с подробными комментариями, думаю, что все тут должно быть понятно:

https://postimg.cc/RJMKXyTB

Если все же что-то неясно - не стесняйтесь спрашивать. Полученный код:

https://pastebin.com/UsY0TZvc

Предыдущая версия:

Метапрог-прототип, версия 5



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

Судя по всему, у нас немножко отличается логика. В Лабвью у меня каждый из 10 раз происходит генерация 100000 строк, у тебя - только раз, что может дать фору в секунду-две. Надо сместить for _ in 0..10 do повыше.

На чистом рукописном Си можешь запилить?

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

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

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

Вам уже 100500 раз разные люди приводили самые разные аналоги

Никаких нормальных аналогов Метапрогу кроме Лабвью нет. Если есть и это еще не обсуждалось - ткни пальцем.

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

И без гугла понятно, что Лабвью не хуже питона, если не заниматься драйверами и ядрами ОС под х86.

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

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

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

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

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

Ну так делай, покажи класс, ты ж ведь у нас не менее чем проФФесор, да? Или ты боишься, что получится только «графический брейнфак» а-ля i-rinat?

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

Никаких нормальных аналогов Метапрогу кроме Лабвью нет

Нет метапрога кроме метапрога и котечка пророк его.

А потом Вы удивляетесь что Вас посылают в Гугл, что Вас не любят, что над Вами глумятся…

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

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

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

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

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

Вам 100500 раз разные люди говорили что это не нужно делать вообще, но поскольку Вы необучаемый дворник…

Если бы Вы были вменяемы, я бы не был занят более интересными вещами и у Вас было бы финансирование, то я бы может и сделал. Но поскольку Вы необучаемый дворник клянчащий хотя бы 5 баксов в виде доната, то я могу над Вами только глумиться. Простите…

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

Судя по всему, у нас немножко отличается логика. В Лабвью у меня каждый из 10 раз происходит генерация 100000 строк, у тебя - только раз, что может дать фору в секунду-две. Надо сместить for _ in 0..10 do повыше.

Исправил.

open System;
open System.Diagnostics;

[<EntryPoint>]
let main argv =
    let random = Random()
    
    let randomStr = 
        let chars = "abcdefghijklmnopqrtuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
        let charsLen = chars.Length
        
        fun len -> 
            let randomChars = [|for _ in 0..len -> chars.[random.Next(charsLen)]|]
            new string(randomChars)
    
    let randomString100(_) = randomStr(100)
    
    let randomString20(_) = randomStr(20)
    
    for _ in 0..10 do
        let stopWatch = Stopwatch.StartNew()
        let listString100 = List.init 100000 randomString100
        let mutable matches = 0
        for _ in 0..1000 do
            let s20 = randomString20()
            let found = 
                listString100 
                |> List.exists (fun s100 -> s100.Contains(s20))
            if found then matches <- matches + 1
    
        printfn "%d strings matches, time = %f" 
            matches stopWatch.Elapsed.TotalMilliseconds
    0 // return an integer exit code

Repl:

0 strings matches, time = 24167.033200
0 strings matches, time = 23739.963200
0 strings matches, time = 25250.747500
0 strings matches, time = 23176.291200
0 strings matches, time = 23077.360300
0 strings matches, time = 23624.151100
0 strings matches, time = 24353.565100
0 strings matches, time = 23598.490300
0 strings matches, time = 23604.457700
0 strings matches, time = 23379.402600
0 strings matches, time = 23830.667800

А вот памяти стал побольше жрать, увеличивалось понемногу каждую итерацию, видать сборщик мусора решил так надо :): https://imgur.com/a/eb9Nd5d

fsi - это типа F Sharp Interactive

ConsoleApp4 - это типа прога в байткоде

Bytecode:

0 strings matches, time = 15424.552200
0 strings matches, time = 14901.515600
0 strings matches, time = 14619.991000
0 strings matches, time = 13653.333900
0 strings matches, time = 14408.432500
0 strings matches, time = 14945.897600
0 strings matches, time = 14702.474000
0 strings matches, time = 15380.244000
0 strings matches, time = 14522.268400
0 strings matches, time = 13523.723800
0 strings matches, time = 14250.435300

Когда скомпилировал в bytecode, то сборщик мусора работал, максимум памяти было 60 с небольшим мегабайт, но быстро возвращалась к 30 с небольшим…

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

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

Из недавнего: после закрытия окошка на нуклеар+ у меня некорректно работали новые окна. Котечка нашел, что дело в SDL_Quit из функции закрытия нуклеаровского окошка, после которого начинаются проблемы с новыми. Я переделал закрытие окошка без SDL_Quit - и, черт побери, работает!!! И так было не один раз. На фоне этого мне плевать на его индекс Хирша.

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

Про генератор Си? Я его щупал, он у меня есть.

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

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

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

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

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

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

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

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

Изучать все придется слишком долго и нудно. Мне и без того приходится находить время на допилку прототипа, и как пилить его на Лабвью я знаю. Я по Лабвью вообще никому вопросы тут не задавал, и даже гуглу задаю вопросы по нему крайне редко - вот что значит простая и понятная среда разработки! Но текстовые технологии, которые не освоить без манов, книжек и гугла, Котечка знает лучше меня и очень помогает проекту.

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

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

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

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

Мнение анскильной лалки, не способной жить без сборщика мусора.

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

Но я нашел ему куда более широкое применение. Жаль что копирасты слишком тупы для этого

«В лаборатории стоял микроскоп и учёные пялились в него на какие то стекляшк, но я как рукожопый плотник нашел для него куда более широкое применение в качестве молотка. Жаль учёные слишком тупы для этого»

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

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

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

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

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

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

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

Это какая то реинкарнация Попова и Бабушкина. Меня вот очень волнует судьба гусей…

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

Да пока рано говорить об анти чем-либо, ждем ебилдов так сказать )

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

Интересно все же как будет в сишке.

Самому стало интересно, надеюсь не накосячил, если что все вопросы к PVS-Studio :)

// This is a personal academic project. Dear PVS-Studio, please check it.
// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <time.h>
#include <assert.h>

typedef char* owned_string;

typedef char const* unowned_string;

typedef unowned_string* unowned_string_ptr;

typedef void* not_null_void_ptr;

typedef owned_string* owned_array_owned_string;

typedef char const*const* unowned_array_unowned_string;


not_null_void_ptr my_malloc(size_t size)
{
	void* result = malloc(size);
	if (result == NULL) {
		fprintf(stderr, "malloc\n");
		abort();
	}
	return result;
}

owned_string random_str(size_t len)
{
	static const char chars[] = 
		"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
	static const size_t chars_len = sizeof(chars)-1; // не учитываем последний '\0'

	owned_string random_chars = (owned_string)my_malloc(len+1); // +1 для '\0'
	for (size_t i = 0; i < len; ++i) {
		random_chars[i] = chars[rand() % chars_len];
	}
	random_chars[len] = '\0';
	return random_chars;
}

owned_string random_string_100()
{
	return random_str(100);
}

owned_string random_string_20()
{
	return random_str(20);
}

owned_array_owned_string array_init(size_t len, owned_string(*initializer) ())
{
	owned_array_owned_string array = 
		(owned_array_owned_string)my_malloc(len*sizeof(owned_string));

	for (size_t i = 0; i < len; ++i) {
		array[i] = initializer();
	}
	return array;
}

void array_free(size_t len, owned_array_owned_string array)
{
	for (size_t i = 0; i < len; ++i) {
		free(array[i]);
	}
	free(array);
}

static unowned_string_ptr test_string = NULL;

bool has_substring_of_test_string_in_str(unowned_string str)
{
	assert(test_string != NULL);
	return strstr(str, *test_string) != NULL;
}

bool array_exists(size_t len, 
	unowned_array_unowned_string arr, bool (*pred)(unowned_string))
{
	for (size_t i = 0; i < len; ++i) {
		if (pred(arr[i])) {
			return true;
		}
	}
	return false;
}


int main(void)
{
	srand((unsigned)time(NULL));

	for (int i = 0; i < 10; ++i) 
	{
		clock_t start = clock();
		size_t array_size = 100000;
		owned_array_owned_string array = array_init(array_size, random_string_100);
		size_t matches = 0;
		for (int j = 0; j < 1000; ++j)
		{
			owned_string s20 = random_string_20();
			unowned_string temp = s20;
			test_string = &temp;
			bool found = array_exists(array_size, (unowned_array_unowned_string)array,
				has_substring_of_test_string_in_str);
			if (found) {
				++matches;
			}
			free(s20);
			test_string = NULL; // просто убираем висячий указатель на 
			// всякий случай, компилятор выкинет это, но так спокойней
		}
		array_free(array_size, array);
		clock_t end = clock();
		double time_elapsed = ((double)(end - start)) / CLOCKS_PER_SEC;
		printf("%zu strings matches, time=%f\n", matches, time_elapsed);
	}
}

https://i.imgur.com/6555UVj.png

0 strings matches, time=6.982000
0 strings matches, time=6.681000
0 strings matches, time=6.776000
0 strings matches, time=6.803000
0 strings matches, time=6.741000
0 strings matches, time=6.665000
0 strings matches, time=6.646000
0 strings matches, time=6.686000
0 strings matches, time=6.854000
0 strings matches, time=7.093000
fsb4000 ★★★★★
()
Последнее исправление: fsb4000 (всего исправлений: 1)
Ответ на: комментарий от metaprog

слегка ошибся с F#, там включаются диапазоны…

> [1..10];;
val it : int list = [1; 2; 3; 4; 5; 6; 7; 8; 9; 10]

Так что правильный код такой:

open System;
open System.Diagnostics;

[<EntryPoint>]
let main argv =
    let random = Random()
    
    let randomStr = 
        let chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
        let charsLen = chars.Length
        
        fun len -> 
            let randomChars = [|for _ in 0..len-1 -> chars.[random.Next(charsLen)]|]
            new string(randomChars)
    
    let randomString100(_) = randomStr(100)
    
    let randomString20(_) = randomStr(20)
    
    for _ in 1..10 do
        let stopWatch = Stopwatch.StartNew()
        let listString100 = List.init 100000 randomString100
        let mutable matches = 0
        for _ in 1..1000 do
            let s20 = randomString20()
            let found = 
                listString100 
                |> List.exists (fun s100 -> s100.Contains(s20))
            if found then matches <- matches + 1
    
        printfn "%d strings matches, time = %f" 
            matches stopWatch.Elapsed.TotalMilliseconds
    0 // return an integer exit code
fsb4000 ★★★★★
()
Ответ на: комментарий от fsb4000

Python.

Обычный random.choice:

# py-random-choice.py

import random
import time

alphabet = 'abcdefghijklmnopqrtuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
array_size = 100000
haystack_length = 1000
needle_length = 20
num_searches = 1000

t_start = time.time()
a = list()
for _ in range(array_size):
    a += [''.join(random.choice(alphabet) for _ in range(haystack_length))]
gen_time = time.time() - t_start
print('generated haystacks in {:.2f} secs'.format(gen_time))

t_start = time.time()
needle = ''.join(random.choice(alphabet) for _ in range(needle_length))
count = 0
for n in range(num_searches):
    for k in range(array_size):
        count += (needle in a[k])
search_time = time.time() - t_start
print('found {} needles in {:.2f} secs'.format(count, search_time))

и хитровывернутый через os.urandom:

# py-os-urandom.py
import sys
import os
import time

alphabet = 'abcdefghijklmnopqrtuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
array_size = 100000
haystack_length = 1000
needle_length = 20
num_searches = 1000

t_start = time.time()
a = list()
if sys.version_info[0] == 3:
    for _ in range(array_size):
        a += [''.join(alphabet[k % len(alphabet)] for k in os.urandom(haystack_length))]
else:
    for _ in range(array_size):
        a += [''.join(alphabet[ord(k) % len(alphabet)] for k in os.urandom(haystack_length))]
gen_time = time.time() - t_start
print('generated haystacks in {:.2f} secs'.format(gen_time))

t_start = time.time()
if sys.version_info[0] == 3:
    needle = ''.join(alphabet[k % len(alphabet)] for k in os.urandom(needle_length))
else:
    needle = ''.join(alphabet[ord(k) % len(alphabet)] for k in os.urandom(needle_length))

count = 0
for n in range(num_searches):
    for k in range(array_size):
        count += (needle in a[k])
search_time = time.time() - t_start
print('found {} needles in {:.2f} secs'.format(count, search_time))

Делал только по одному запуску, ибо смысла в нескольких нет. Зато через python2, python3, pypy и pypy3:

$ for p in python2 pypy python3 pypy3; do for s in py-random-choice.py py-os-urandom.py; do echo -e "\n== time $p $s"; /usr/bin/time $p $s; done; done

== time python2 py-random-choice.py
generated haystacks in 35.86 secs
found 0 needles in 66.55 secs
102.38user 0.04system 1:42.43elapsed 99%CPU (0avgtext+0avgdata 116064maxresident)k
0inputs+0outputs (0major+28021minor)pagefaults 0swaps

== time python2 py-os-urandom.py
generated haystacks in 17.66 secs
found 0 needles in 58.89 secs
75.76user 0.79system 1:16.56elapsed 99%CPU (0avgtext+0avgdata 114112maxresident)k
0inputs+0outputs (0major+27890minor)pagefaults 0swaps

== time pypy py-random-choice.py
generated haystacks in 6.15 secs
found 0 needles in 38.18 secs
44.28user 0.09system 0:44.39elapsed 99%CPU (0avgtext+0avgdata 215908maxresident)k
0inputs+0outputs (0major+46470minor)pagefaults 0swaps

== time pypy py-os-urandom.py
generated haystacks in 5.07 secs
found 0 needles in 39.92 secs
44.31user 0.70system 0:45.02elapsed 99%CPU (0avgtext+0avgdata 202484maxresident)k
0inputs+0outputs (0major+44593minor)pagefaults 0swaps

== time python3 py-random-choice.py
generated haystacks in 67.14 secs
found 0 needles in 70.17 secs
137.28user 0.10system 2:17.39elapsed 99%CPU (0avgtext+0avgdata 116912maxresident)k
0inputs+0outputs (0major+27576minor)pagefaults 0swaps

== time python3 py-os-urandom.py
generated haystacks in 13.92 secs
found 0 needles in 60.80 secs
74.03user 0.76system 1:14.79elapsed 99%CPU (0avgtext+0avgdata 114896maxresident)k
0inputs+0outputs (0major+27473minor)pagefaults 0swaps

== time pypy3 py-random-choice.py
generated haystacks in 12.38 secs
found 0 needles in 41.98 secs
54.39user 0.08system 0:54.50elapsed 99%CPU (0avgtext+0avgdata 246924maxresident)k
0inputs+0outputs (0major+54386minor)pagefaults 0swaps

== time pypy3 py-os-urandom.py
generated haystacks in 5.82 secs
found 0 needles in 41.63 secs
46.37user 0.96system 0:47.53elapsed 99%CPU (0avgtext+0avgdata 216616maxresident)k
0inputs+0outputs (0major+45457minor)pagefaults 0swaps

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

Для референса — сишная версия, gcc -O2:

$ ./a.out 
0 strings matches, time=3.437369
0 strings matches, time=3.524938
0 strings matches, time=3.380826
0 strings matches, time=3.299814
0 strings matches, time=3.291825
0 strings matches, time=3.323610
0 strings matches, time=3.351791
^C
i-rinat ★★★★★
()
Ответ на: комментарий от metaprog

Котечка нашел, что дело в SDL_Quit из функции закрытия нуклеаровского окошка, после которого начинаются проблемы с новыми. Я переделал закрытие окошка без SDL_Quit - и, черт побери, работает!!!

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

Use this function to clean up all initialized subsystems.

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

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

Реально какой-то детский сад. Методом тыка изучать документированное апи открытой библиотеки - новый уровень деградантства.

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

Методом тыка изучать…

Ну сам же ТС неоднократно хвалился тем, что изучил лабвьюшные кубики методом тыка, на то они и высокоуровневые абстракции. А вот с низкоуровневым сишным SDL такая засада.

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

Ну и к данному случаю с SDL отлично подойдет цитата: "… вы … позволяете себе с развязностью совершенно невыносимой подавать какие-то советы космического масштаба и космической же глупости о том, как всё поделить… А в то же время вы наглотались зубного порошку…

– Третьего дня…"

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

Я скомпилировал clang с -O3:

0 strings matches, time=1.712738
0 strings matches, time=1.716502
0 strings matches, time=1.709244
0 strings matches, time=1.709134
0 strings matches, time=1.739564
0 strings matches, time=1.724409
0 strings matches, time=1.761619
0 strings matches, time=1.761333
0 strings matches, time=1.771088
0 strings matches, time=1.759763

-O2

0 strings matches, time=2.036794
0 strings matches, time=2.120071
0 strings matches, time=2.103247
0 strings matches, time=2.107985
0 strings matches, time=1.983489
0 strings matches, time=1.973857
0 strings matches, time=1.936282
0 strings matches, time=1.964998
0 strings matches, time=1.975702
0 strings matches, time=1.960633

Без флага оптимизации

0 strings matches, time=2.589900
0 strings matches, time=2.699723
0 strings matches, time=2.643231
0 strings matches, time=2.680188
0 strings matches, time=2.669055
0 strings matches, time=2.784514
0 strings matches, time=2.762654
0 strings matches, time=2.679853
0 strings matches, time=2.712933
0 strings matches, time=2.716376

Кстати, я всегда компилирую трансляции Метапрога с -O3 для максимальной скорости. Для сравнения питон Рината (первая реализация, python 2.7.16):

generated haystacks in 46.90 secs
found 0 needles in 55.01 secs

Вторая реализация:

generated haystacks in 20.36 secs
found 0 needles in 56.74 secs

Она дергает (сишный?) os-urandom, что в 2 с хвостиком раза ускоряет генерацию строк (которая на Лабвью не занимает и одной микросекунды), но сами проходы занимают столько же сколько и в первом примере.

Черт побери, компиляция сишки с -O3 (мгновенная!) и десять проходов заняли намного меньше, чем один проход питоном!!! Вот тебе, liksys, и все твои потуги с O(n). Обо всяких там теориях управления сложностью алгоритмов уместно будет говорить тогда и только тогда, когда их выполнение будет предельно быстрым. Питон тут сливает подчистую.

Для сравнения Лабвью в среднем 30 секунд за проход. Это, конечно, скриптуха, но питон даже ей сливает в более чем 3 раза. Нахрена мне учить питон, если Лабвью не только проще, но еще и в разы быстрее?

Как запустить пример на F#? Дай плиз краткую инструкцию, хочу иметь бенчмарк именно на своей машине для объективности.

Еще хотелось бы видеть бенчмарк для С++ с максимумом чисто плюсовых плюшек, интересно насколько он медленнее чистого Си.

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

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

Ну сам же ТС неоднократно хвалился тем, что изучил лабвьюшные кубики методом тыка, на то они и высокоуровневые абстракции. А вот с низкоуровневым сишным SDL такая засада.

Засада в том, что почему-то nkc_shutdown (содержащий SDL_Quit) при следующем открытии окошка не полностью уравновешивается nkc_init. Почему?

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

А название функции тебе самому ничего не говорило?

Я работал с nkc_shutdown, который, если верить названиям на аглицком, должен полностью уравновешиваться nkc_init. И тут Котечка нашел SDL_Quit, убрав который я заставил все работать.

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

У меня

Traceback (most recent call last):
  File "python_benchmark3.py", line 3, in <module>
    from random import choices
ImportError: cannot import name choices

Только без pip пожалуйста:)

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