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)

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

А может это ты просто необучаемый дворник, учитывая, что НИКТО в этом треде не испытывает проблем с документацией?

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

сейчас складывается такое впечатление что вас все устраивает кроме скорости исполнения

Не только скорость, еще и ограниченность, умноженная на закрытость.

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

Посмотрел твой код, да действительно regex работает быстрее contains, кто бы знал…

Я нашёл одно место, которое вероятно ты уже тоже увидел:

В С версии мы параллелим самый верхний цикл for (после числа попыток)

#define NUM_SEARCHES UINT64_C(1000)
/* ... */
    size_t count = 0;
#pragma omp parallel for reduction(+ : count)
    for (size_t iter = 0; iter < NUM_SEARCHES; iter++) {

А в Rust нет. Я передвинул into_par_iter() повыше, и стало побыстрее.

Ещё я передвинул создание needle и needle_regex внутрь, потому что в условие вроде так было, и у меня на С…

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

extern crate rand;
extern crate rayon;
use rand::Rng;
use rand::distributions::Alphanumeric;
use rayon::prelude::*;
use std::time::Instant;
use regex::Regex;
use regex;

fn main() {
    for _ in 0..10 {
        let timer = Instant::now();
        let vec: Vec<String> = (0..100_000)
            .into_par_iter()
            .map_init(
                || rand::thread_rng(),
                |rng, _| rng.sample_iter(&Alphanumeric).take(100).collect()
            ).collect();

        let overall_count: u32 =
            (0..1000)
                .into_par_iter()
                .fold(|| 0u32, |acc,  _| {
                    let needle: String = rand::thread_rng()
                        .sample_iter(&Alphanumeric)
                        .take(20)
                        .collect();
                    let needle_regex = Regex::new(&regex::escape(&needle)).unwrap();
                    if (&vec).iter().any(|s100 | {
                        needle_regex.find(&s100).is_some()
                    }) {
                        acc + 1
                    }
                    else {
                        acc
                    }
                })
                .sum();

        println!("Found {} instances of in {:.2} secs", overall_count,
                 timer.elapsed().as_secs_f64());
    }
}
fsb4000 ★★★★★
()
Последнее исправление: fsb4000 (всего исправлений: 2)
Ответ на: комментарий от abcq

не презирать же его за это, повзрослеет рано или поздно

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

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

А что ТЫ сделал для того, чтобы приблизить релиз Метапрога «на самом себе»?

А может ТЫ САМ начнешь решать СВОИ проблемы?

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

Ну вот ты и пришел к просветлению. Незачем тебе ЛОР, он стал слишком тесен для тебя. Пили свой форум и обрастай адептами. Алга!

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

А зачем тогда вы лору? На самом деле лор не для этого, ну так по-дружески между нами.

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

Да, тоже видел. Видимо, ещё медленнее было.

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

Раз уж ко всему добавляют параллельность, если не лень, то посмотри на параллельную версию F# (и ещё я сменил List на Array)

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 = Array.init 100000 randomString100
        let  matches = 
            [|1..1000|]
            |> Array.Parallel.map (fun _ -> 
                let s20 = randomString20()
                listString100 
                    |> Array.exists (fun s100 -> s100.Contains(s20))
                    |> fun exists -> if exists then 1 else 0)
            |> Array.sum

        printfn "%d strings matches, time = %f" 
            matches stopWatch.Elapsed.TotalMilliseconds
    0 // return an integer exit code
fsb4000 ★★★★★
()
Ответ на: комментарий от metaprog

Не спрашивай, что ЛОР может сделать для тебя, – спрашивай, что ты можешь сделать для ЛОРа.

Не только скорость, еще и ограниченность, умноженная на закрытость.

Зато документацию читать не надо .

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