Страница 1 из 1

Скорость обработки, как функция места переменной?

Добавлено: 11 июн 2017, 21:24
ESeid
Создаем рекурсивный алгоритм обработки сигнала, очень важный параметр - скорость обработки. На входе - массив, соответствующий стандартному видеокадру.
Заметил эффект, коему нигде не увидел описания: скорость обработки цикла зависит от места положения переменных в нем. Для проверки написал простенький алгоритм, вычисляющий почленную разницу двух массивов. Проверил в трех состояниях: 1. - обе переменные вне цикла, 2 - одна переменная внутри цикла, 3 - обе переменные внутри цикла. Скорость исполнения вычисляется, как время исполнения, деленная на количество циклов. Результат говорит сам за себя:
1. - 6360 циклов/сек.
2. - 1533 циклов/сек.
3. - 620 циклов/сек.
Господа знатоки! У кого-нибудь есть обьяснения этому странному падению скорости? И как с этим бороться?
Сам VI и фото всех трех состояний прилагаю.

Re: Скорость обработки, как функция места переменной?

Добавлено: 11 июн 2017, 21:46
Kosist
Я, может быть, и ошибаюсь, но объяснение, кажется, простое:
1. На входе в цикл создаются копии данных с контролов, в память. На каждой итерации происходит считывание не с локальных переменных, а с памяти - что довольно быстро.
2. В каждой итерации происходит считывание с локальной переменной - :labview: копирует данные с контрола (при этом нет переключения в user interface thread), а затем копирует их в буфер обмена данных.
3. Происходит считывание с двух локальных переменных каждую итерацию цикла.
Вот здесь - http://www.labviewcraftsmen.com/blog/ge ... s-by-index - интересно расписано, как :labview: записывает данные в контрол. Думаю, что считывание будет выполнятся в обратном порядке.

Re: Скорость обработки, как функция места переменной?

Добавлено: 11 июн 2017, 22:17
dadreamer
Ну да, тут особо добавить нечего.
1. Операция однократного копирования из транспортного буфера в ячейку памяти перед циклом. Дальше цикл на каждой итерации читает эту ячейку.
2 и 3. Операция многократного копирования - выполняется каждую итерацию. В 2 для одной переменной, в 3 для обеих.

Хотя это здесь не принципиально, но легко видеть, что в 1 используются фиксированные значения переменных, тогда как в 3 используются текущие значения. Это может быть важно в некоторых архитектурах (возможность поменять значения переменных "на лету").

ЗЫ: инициализацию переменных и Request Deallocation (смысл его использования?) надо привязать к рамке кейса, чтобы явно задать поток данных.

Re: Скорость обработки, как функция места переменной?

Добавлено: 12 июн 2017, 15:42
ESeid
Kosist, dadreamer, огромное спасибо за консультацию! Начал понимать, где собака порылась. ;)
dadreamer, Request Deallocation я поставил по инерции - я ее всегда ставлю. Рефлексы. ;)

Re: Скорость обработки, как функция места переменной?

Добавлено: 12 июн 2017, 15:56
dadreamer
ESeid писал(а):dadreamer, Request Deallocation я поставил по инерции - я ее всегда ставлю. Рефлексы. ;)
И как, помогает? :wink:

Re: Скорость обработки, как функция места переменной?

Добавлено: 12 июн 2017, 17:51
ESeid
dadreamer писал(а):И как, помогает? :wink:
- Ребе, как мне вернуть мужа от любовницы?
- Сара, возьми немножко волос с расчески мужа, заверни в бумажку с молитвой, которую я тебе напишу, и зарой безлунной ночью под порогом дома разлучницы.
- Ребе, и это поможет?
- Не помешает... ;)