По следам книги "Совершенный код" решил сделать сравнение разных вариантов FGV.
Оригинальная "глобальная" переменная строится на цикле whule. А почему не for?
Регистры появились сильно позже, так что их игнорирование понятно, но вот выбор цикла по-моему ничем не обусловлен. Просто так повелось.
Ну и для приличия сравнил вариант хранения в контролах.
Итог: статистически не особо значимое отставание while на двух разных машинах.
А вот поведение контролов совсем не очевидно и даже неожиданно
сравнение FGV
-
Andrew Lunev
- VIP
- Сообщения: 957
- Зарегистрирован: 11 дек 2010, 12:31
- Награды: 2
- Версия LabVIEW: 2014-2021
- Откуда: Москва
- Благодарил (а): 4 раза
- Поблагодарили: 10 раз
Re: сравнение FGV
Спасибо за интересный тест!
Мне показалось, что он немного не идентичен в кадрах и я его поправил.
Получил немного другое распределение времён. Запускал попеременно оба теста 5 раз. Распределение не менялось.
У меня получилось, что цикл For всегда чуть проигрывает Wile, а вариант с Shift Register практически равен по скорости Wile.
Тестировал в LV2019. Что интересно, пока не открыл все SubVI и не пересохранил в новой версии время выполнения было в районе 68, после пересохранения стало 12. Видимо до сохранения использовался код из LV2015.
Мне показалось, что он немного не идентичен в кадрах и я его поправил.
Получил немного другое распределение времён. Запускал попеременно оба теста 5 раз. Распределение не менялось.
У меня получилось, что цикл For всегда чуть проигрывает Wile, а вариант с Shift Register практически равен по скорости Wile.
Тестировал в LV2019. Что интересно, пока не открыл все SubVI и не пересохранил в новой версии время выполнения было в районе 68, после пересохранения стало 12. Видимо до сохранения использовался код из LV2015.
-
IvanLis
- guru
- Сообщения: 5467
- Зарегистрирован: 02 дек 2009, 17:44
- Награды: 7
- Версия LabVIEW: 2015, 2016
- Откуда: СССР
- Благодарил (а): 28 раз
- Поблагодарили: 88 раз
Re: сравнение FGV
Это наверняка из текстовых языков программирования повелось.
Кто программировал, например на Pascal, тот помнит, что есть циклы с предусловием и постусловием.
Например цикл FOR, это цикл с предусловием (или цикл со счетчиком), получается, что при невыполнении условия он может выполниться "0" раз, т.е. не выполниться ни разу. В этом случае FGV будет однозначно работать неправильно, только потому что вы не определили количество итераций "=1".
UNTIL - цикл с пост условием.
А вот конструкция WHILE в текстовых языках неоднозначна, и условие может проверяться как до выполнения, так и после.
Хотя если взять цикл с постусловием, то UNTIL и WHILE отличаются только условием установки (пока/если).
Однако в LabVIEW неоднозначность для WHILE снята и проверить условие до выполнения цикла не получится, он легко преобразуется в UNTIL.
Но независимо от результатов сравнения, тело цикла WHILE будет выполнено хотя бы раз. Что уменьшает риск допустить ошибку при программировании, т.к. если условие остановки не будет задано, то компилятор выдаст ошибку.
Ну и понятно, что логическую ошибку в программе локализовать значительно сложнее синтаксической.
Знание нескольких принципов освобождает от знания многих фактов!
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
-
- professor
- Сообщения: 3407
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 176 раз
- Контактная информация:
Re: сравнение FGV
идентичность в проводах исходного массива? я специально его размножил, чтобы программа не делала это на ходу и не тратили время в процессе теста, а использовала уже готовый вариантAndrew Lunev писал(а): ↑22 окт 2020, 21:04 Мне показалось, что он немного не идентичен в кадрах и я его поправил.
-
Andrew Lunev
- VIP
- Сообщения: 957
- Зарегистрирован: 11 дек 2010, 12:31
- Награды: 2
- Версия LabVIEW: 2014-2021
- Откуда: Москва
- Благодарил (а): 4 раза
- Поблагодарили: 10 раз
Re: сравнение FGV
Знать бы точно, как это всё внутри LV обрабатывается. Я исходил из того, что в каждом кадре если и идет размножение, то во всех кадрах одинаково и время на это тратится одинаково.
В исходном варианте получается в кадр Wile приходит 4 массива и выходит три. Возможно LV тратит время на передачу этих массивов между кадрами даже если в самом кадре они не используются. И тогда получается что в разных кадрах приходит и выходит разное количество массивов. Я не знаю насколько это помогает или мешает, но результат точно отличается.
Какой из вариантов даёт более правильный результат я не знаю.
В исходном варианте получается в кадр Wile приходит 4 массива и выходит три. Возможно LV тратит время на передачу этих массивов между кадрами даже если в самом кадре они не используются. И тогда получается что в разных кадрах приходит и выходит разное количество массивов. Я не знаю насколько это помогает или мешает, но результат точно отличается.
Какой из вариантов даёт более правильный результат я не знаю.
-
Andrew Lunev
- VIP
- Сообщения: 957
- Зарегистрирован: 11 дек 2010, 12:31
- Награды: 2
- Версия LabVIEW: 2014-2021
- Откуда: Москва
- Благодарил (а): 4 раза
- Поблагодарили: 10 раз
-
Andrew Lunev
- VIP
- Сообщения: 957
- Зарегистрирован: 11 дек 2010, 12:31
- Награды: 2
- Версия LabVIEW: 2014-2021
- Откуда: Москва
- Благодарил (а): 4 раза
- Поблагодарили: 10 раз
Re: сравнение FGV
Последний мой вариант точно дает неверное значение, так как не выполняется принцип потока данных. Генерация массива идет параллельно с выполнением первого кадра последовательности. Поэтому в Wile чуть завышенное время выполнения. Не подумал об этом, когда редактировал код.
-
- professor
- Сообщения: 3407
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 176 раз
- Контактная информация:
Re: сравнение FGV
Да, про количество массивов верное замечание. Как система это обрабатывает, не понятно.Andrew Lunev писал(а): ↑22 окт 2020, 21:16 Знать бы точно, как это всё внутри LV обрабатывается. Я исходил из того, что в каждом кадре если и идет размножение, то во всех кадрах одинаково и время на это тратится одинаково.
-
- professor
- Сообщения: 3407
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 176 раз
- Контактная информация:
Re: сравнение FGV
Решил этим воспользоваться и сделать совсем оригинальный вариант FGV Результаты совсем непонятные. При первом запуске последний вариант отставал от традиционных раз а в два. Но при втором открытии скорости выровнялись, а на "малых" выборках последний вариант даже ощутимо быстрее. Подозреваю, что операции с массивами вносят большую погрешность в измерения
- Вложения
-
- fgvTest.7z
- (48.52 КБ) 90 скачиваний