#performance #optimization #basic #loop-unrolling
#Производительность #оптимизация #Базовые модели #развертывание цикла
Вопрос:
У меня есть встроенный процессор, на котором работает урезанная версия BASIC (штамп Parallax BASIC). В цикле я записываю 1024 значения через шину SPI.
В скомпилированных языках большую скорость можно получить, разворачивая цикл (помещая больше инструкций в цикл, уменьшая отношение накладных расходов к операторам). Однако я не уверен в BASIC, поскольку это интерпретирующий язык, и каждое утверждение интерпретируется перед его выполнением.
Профилирование затруднено, поскольку я должен найти доступный вывод, записать на него импульс, а затем измерить с помощью o’scope.
С теоретической точки зрения, обеспечивает ли развертывание цикла в BASIC какие-либо преимущества в скорости?
Комментарии:
1. Так сложно найти какую-либо информацию о basic, не так ли! Кажется, на каждом веб-сайте где-то есть слово basic!
2. Я бы предположил, что это действительно дает преимущество, если код в теле цикла очень легкий. Кстати, можете ли вы использовать встроенный эмулятор? Если это так, вы могли бы выполнить его пошагово и / или случайным образом приостановить.
3. @Mike Dunlavey: Для платы параллаксных штампов нет ICE. Все, что у меня есть, это инструкции печати и возможность записывать сигналы. В нем могут быть часы, но это слишком много кода для вывода времени (на панели штампов не так много кода или пространства переменных).
4. @Rich Bradshaw: Другая проблема заключается в том, что для BASIC нет стандарта.
5. Вам нужно преимущество в скорости или вы просто пытаетесь оптимизировать без причины? Если вам нужна выгода, то вы должны быть в состоянии измерить разницу в скорости.
Ответ №1:
Теоретически, развертывание цикла уменьшает количество времени, затрачиваемого на увеличение и сравнение внутри цикла. За счет сокращения времени выполнения цикла происходит выигрыш в производительности.
Количество выигранного времени может быть не столь значительным для интерпретируемой программы, как для скомпилированной программы. Интерпретатору требуется много времени, чтобы извлечь инструкцию, интерпретировать (построить код) и выполнить код для инструкции. Для того, чтобы экономия времени при развертывании цикла была значительной, экономия времени должна быть больше, чем эти накладные расходы.
В отличие от микропроцессоров, интерпретаторы могут не быть оптимизированы по скорости выполнения. Современные процессоры имеют высокоскоростные кэши, методы прогнозирования ветвлений и прогнозирования будущего. Некоторые из них могут даже извлекать новые инструкции в кэш по мере выполнения других. Развертывание цикла использует преимущества этих функций, уменьшая количество переходов и делая выполнение более предсказуемым. Для скомпилированных языков это добавляет значительную экономию (при больших итерациях). Эта экономия времени на производительность может быть неприменима к большинству интерпретаторов, поскольку они могут не использовать эти функции.
Лучшее определение улучшения производительности — это измерение. В моем случае должно быть достаточно жалоб пользователя, чтобы оправдать нарушение графика для выполнения измерения.