сравнение FGV

Общие принципы, проектирование, модуляризация, темплейты и шаблоны
Ответить
Artem.spb

Activity Автор
professor
professor
Сообщения: 3394
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 172 раза
Контактная информация:

сравнение FGV

Сообщение Artem.spb »

По следам книги "Совершенный код" решил сделать сравнение разных вариантов FGV.
Оригинальная "глобальная" переменная строится на цикле whule. А почему не for?
while.png
while.png (16.82 КБ) 1900 просмотров
Регистры появились сильно позже, так что их игнорирование понятно, но вот выбор цикла по-моему ничем не обусловлен. Просто так повелось.
Ну и для приличия сравнил вариант хранения в контролах.
Итог: статистически не особо значимое отставание while на двух разных машинах.
Снимок.PNG
Снимок.PNG (5.66 КБ) 1900 просмотров
Снимок2.PNG
Снимок2.PNG (5.83 КБ) 1900 просмотров
А вот поведение контролов совсем не очевидно и даже неожиданно
Вложения
fgvtest.zip
(47.22 КБ) 97 скачиваний
Аватара пользователя
Andrew Lunev

Activity Professionalism
VIP
VIP
Сообщения: 957
Зарегистрирован: 11 дек 2010, 12:31
Награды: 2
Версия LabVIEW: 2014-2021
Откуда: Москва
Благодарил (а): 4 раза
Поблагодарили: 10 раз

Re: сравнение FGV

Сообщение Andrew Lunev »

Спасибо за интересный тест!
Мне показалось, что он немного не идентичен в кадрах и я его поправил.
Получил немного другое распределение времён. Запускал попеременно оба теста 5 раз. Распределение не менялось.
У меня получилось, что цикл For всегда чуть проигрывает Wile, а вариант с Shift Register практически равен по скорости Wile.
Тестировал в LV2019. Что интересно, пока не открыл все SubVI и не пересохранил в новой версии время выполнения было в районе 68, после пересохранения стало 12. Видимо до сохранения использовался код из LV2015.
Вложения
FGV Test.PNG
Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
guru
guru
Сообщения: 5462
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 28 раз
Поблагодарили: 86 раз

Re: сравнение FGV

Сообщение IvanLis »

Artem.spb писал(а): 22 окт 2020, 20:01 Оригинальная "глобальная" переменная строится на цикле whule. А почему не for?
Это наверняка из текстовых языков программирования повелось.
Кто программировал, например на Pascal, тот помнит, что есть циклы с предусловием и постусловием.

Например цикл FOR, это цикл с предусловием (или цикл со счетчиком), получается, что при невыполнении условия он может выполниться "0" раз, т.е. не выполниться ни разу. В этом случае FGV будет однозначно работать неправильно, только потому что вы не определили количество итераций "=1".
UNTIL - цикл с пост условием.
А вот конструкция WHILE в текстовых языках неоднозначна, и условие может проверяться как до выполнения, так и после.
Хотя если взять цикл с постусловием, то UNTIL и WHILE отличаются только условием установки (пока/если).
Однако в LabVIEW неоднозначность для WHILE снята и проверить условие до выполнения цикла не получится, он легко преобразуется в UNTIL.
Но независимо от результатов сравнения, тело цикла WHILE будет выполнено хотя бы раз. Что уменьшает риск допустить ошибку при программировании, т.к. если условие остановки не будет задано, то компилятор выдаст ошибку.

Ну и понятно, что логическую ошибку в программе локализовать значительно сложнее синтаксической.
Artem.spb

Activity Автор
professor
professor
Сообщения: 3394
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 172 раза
Контактная информация:

Re: сравнение FGV

Сообщение Artem.spb »

Andrew Lunev писал(а): 22 окт 2020, 21:04 Мне показалось, что он немного не идентичен в кадрах и я его поправил.
идентичность в проводах исходного массива? я специально его размножил, чтобы программа не делала это на ходу и не тратили время в процессе теста, а использовала уже готовый вариант
Аватара пользователя
Andrew Lunev

Activity Professionalism
VIP
VIP
Сообщения: 957
Зарегистрирован: 11 дек 2010, 12:31
Награды: 2
Версия LabVIEW: 2014-2021
Откуда: Москва
Благодарил (а): 4 раза
Поблагодарили: 10 раз

Re: сравнение FGV

Сообщение Andrew Lunev »

Знать бы точно, как это всё внутри LV обрабатывается. Я исходил из того, что в каждом кадре если и идет размножение, то во всех кадрах одинаково и время на это тратится одинаково.
В исходном варианте получается в кадр Wile приходит 4 массива и выходит три. Возможно LV тратит время на передачу этих массивов между кадрами даже если в самом кадре они не используются. И тогда получается что в разных кадрах приходит и выходит разное количество массивов. Я не знаю насколько это помогает или мешает, но результат точно отличается.
Какой из вариантов даёт более правильный результат я не знаю.
Аватара пользователя
Andrew Lunev

Activity Professionalism
VIP
VIP
Сообщения: 957
Зарегистрирован: 11 дек 2010, 12:31
Награды: 2
Версия LabVIEW: 2014-2021
Откуда: Москва
Благодарил (а): 4 раза
Поблагодарили: 10 раз

Re: сравнение FGV

Сообщение Andrew Lunev »

Еще один вариант передачи массивов в кадр и опять немного другие значения...
Вложения
FGV Test2.PNG
Аватара пользователя
Andrew Lunev

Activity Professionalism
VIP
VIP
Сообщения: 957
Зарегистрирован: 11 дек 2010, 12:31
Награды: 2
Версия LabVIEW: 2014-2021
Откуда: Москва
Благодарил (а): 4 раза
Поблагодарили: 10 раз

Re: сравнение FGV

Сообщение Andrew Lunev »

Последний мой вариант точно дает неверное значение, так как не выполняется принцип потока данных. Генерация массива идет параллельно с выполнением первого кадра последовательности. Поэтому в Wile чуть завышенное время выполнения. Не подумал об этом, когда редактировал код.
Artem.spb

Activity Автор
professor
professor
Сообщения: 3394
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 172 раза
Контактная информация:

Re: сравнение FGV

Сообщение Artem.spb »

Andrew Lunev писал(а): 22 окт 2020, 21:16 Знать бы точно, как это всё внутри LV обрабатывается. Я исходил из того, что в каждом кадре если и идет размножение, то во всех кадрах одинаково и время на это тратится одинаково.
Да, про количество массивов верное замечание. Как система это обрабатывает, не понятно.
Artem.spb

Activity Автор
professor
professor
Сообщения: 3394
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 172 раза
Контактная информация:

Re: сравнение FGV

Сообщение Artem.spb »

IvanLis писал(а): 22 окт 2020, 21:09 Например цикл FOR, это цикл с предусловием (или цикл со счетчиком), получается, что при невыполнении условия он может выполниться "0" раз
Решил этим воспользоваться и сделать совсем оригинальный вариант FGV
for2.PNG
for2.PNG (11.35 КБ) 1841 просмотр
Результаты совсем непонятные. При первом запуске последний вариант отставал от традиционных раз а в два. Но при втором открытии скорости выровнялись, а на "малых" выборках последний вариант даже ощутимо быстрее.
times.PNG
times.PNG (6.64 КБ) 1841 просмотр
Подозреваю, что операции с массивами вносят большую погрешность в измерения
Вложения
fgvTest.7z
(48.52 КБ) 88 скачиваний
Ответить

Вернуться в «Модели программирования»