Изучите результаты профилирования настолько энергично, насколько это возможно (см. в этом вопросе для получения некоторых сведений, также ссылающихся на инструменты из OP).
В идеале я ищу что-то, что интегрируется с проверкой CMD R, которая предупреждает меня, когда я ввел в свой код существенную регрессию производительности.
К сожалению, у меня нет ответа на этот вопрос.
Что такое хороший рабочий процесс в целом?
Для меня это очень похоже на общее динамическое тестирование кода: вывод (в данном случае время выполнения) воспроизводим, оптимален и прозрачен? Прозрачность приходит от понимания того, что влияет на общее время. Именно здесь важны предложения Майка Данлавей, но я предпочитаю идти дальше с профилировщиком.
Что касается линейного профилировщика, см. мой предыдущий вопрос , который ссылается на опции в Python и Matlab для других примеров. Наиболее важно изучить время часов, но также очень важно отслеживать распределение памяти, количество раз выполнения строки и глубину стека вызовов.
Какие другие языки предоставляют хорошие инструменты?
Почти все другие языки имеют лучшие инструменты. :) В интерпретируемых языках, таких как Python и Matlab, есть хорошие и, возможно, знакомые примеры инструментов, которые можно адаптировать для этой цели. Хотя динамический анализ очень важен, статический анализ может помочь определить, где могут возникнуть серьезные проблемы. Matlab имеет отличный статический анализатор, который может сообщать, когда объекты (например, векторы, матрицы) растут, например, внутри циклов. Страшно найти это только с помощью динамического анализа - вы уже потратили время выполнения, чтобы обнаружить что-то подобное, и это не всегда заметно, если ваш контекст выполнения довольно прост (например, всего несколько итераций или небольшие объекты).
Что касается методов, не зависящих от языка, вы можете посмотреть:
- Valgrind и cachegrind
- Мониторинг дискового ввода-вывода, грязных буферов и т. Д.
- Мониторинг ОЗУ (Cachegrind полезен, но вы можете просто отслеживать распределение ОЗУ, имного подробностей об использовании ОЗУ)
- Использование нескольких ядер
Это что-то, что может быть построено на тестировании верхнего модуля, или это обычно делается отдельно?
Сложно ответить.Для статического анализа это может произойти до модульного тестирования.Для динамического анализа можно добавить больше тестов.Думайте об этом как о последовательном проектировании (то есть из экспериментальной структуры проектирования): если затраты на выполнение, кажется, в пределах некоторых статистических допусков для вариации одинаковы, то дальнейшие тесты не требуются.Однако если метод В, кажется, имеет среднюю стоимость выполнения больше, чем метод А., то следует выполнить более интенсивные тесты.