тестировать кусок кода, независимый от производительности процессора? - PullRequest
4 голосов
/ 12 ноября 2010

Моя цель : я хочу протестировать производительность кода (или функции), так же, как я проверяю правильность этой функции в модульном тесте, скажем, что результат этогоПроцесс бенчмаркинга - это «индекс производительности функции», который является «переносимым»

Моя проблема - : обычно мы проводим бенчмаркинг кода, используя таймер для подсчета истекшего времени во время выполнения этого кода.и этот метод зависит от аппаратного обеспечения, O / S или другого.

Мой вопрос : существует ли метод для получения «индекса производительности функции», который не зависит от производительностихоста (CPU / OS / и т. д.), или, если не «независимый», скажем, что он «относительно» некоторого фиксированного значения.так что каким-то образом значение «индекса производительности функции» остается действительным на любой платформе или производительности оборудования.

например: это значение FPI может быть измерено в

  • число арифметическихинструкция, необходимая для выполнения одного вызова
  • значение с плавающей запятой по сравнению с эталонной функцией, например, функция B имеет индекс рейтинга 1,345 (то есть производительность медленнее в 1,345 раза, чем эталонная функция)
  • илидругое значение.

примечание , что значение FPI не должно быть научно точным, точным или точным, мне просто нужно значение, чтобы дать приблизительный обзорта производительность функции по сравнению с другой функцией, которая была проверена тем же методом.

Ответы [ 5 ]

5 голосов
/ 12 ноября 2010

Я думаю, что вы в поисках невозможного здесь, потому что производительность современного компьютера представляет собой сложную смесь процессора, кеша, контроллера памяти, памяти и т. Д.

Таким образом, одна (гипотетическая) компьютерная система может вознаградить использование огромных справочных таблиц для упрощения алгоритма, так что было обработано очень мало команд процессора. Принимая во внимание, что другая система может иметь память намного медленнее, чем ядро ​​ЦП, поэтому предпочтение будет отдано алгоритму, который выполняет большую часть обработки, но затрагивает очень мало памяти.

Таким образом, одна «заслуга» для этих двух алгоритмов не могла даже передать, какая была лучше во всех системах, не говоря уже о том, насколько она лучше.

1 голос
/ 12 ноября 2010

Вероятно, вам действительно нужен инструмент, подобный tcov .

man tcov говорит:

Каждый базовый блок кода (или каждый строка, если указана опция -a для tcov) с префиксом количество раз, когда оно было выполнено; линии, которые имеют не были выполнены с префиксом "#####". Основной блок является непрерывным разделом кода, который не имеет ветвей: каждый Оператор в базовом блоке выполняется столько же раз.

1 голос
/ 12 ноября 2010

Нет, такого нет.Разное оборудование работает по-разному.У вас может быть два разных фрагмента кода X и Y, так что аппаратное обеспечение A работает быстрее X, чем Y, а аппаратное оборудование B работает быстрее Y. Абсолютной шкалы производительности не существует, она полностью зависит от аппаратного обеспечения (не говоря уже о других вещах, таких какоперационная система и другие экологические соображения).

0 голосов
/ 12 ноября 2010

Как и другие упоминали, это не тривиальная задача, и может быть невозможно получить какие-либо точные результаты. Рассмотрим несколько методов:

  1. Контрольные функции - Хотя это кажется многообещающим, я думаю, вы обнаружите, что это не будет работать хорошо, если попытаетесь сравнить различные типы функций. Например, если ваша эталонная функция на 100% связана с процессором (как в некоторых сложных математических вычислениях), то она будет хорошо сравниваться / масштабироваться с другими функциями, связанными с процессором, но потерпеть неудачу по сравнению, скажем, с функциями ввода-вывода или с памятью. Тщательное сопоставление функции сравнения с небольшим набором аналогичных функций может работать, но это утомительно / требует много времени.
  2. Количество инструкций - Для очень простого процессора может быть возможным подсчитать циклы каждой инструкции и получить разумное значение для общего числа циклов, которое будет выполнять блок кода, но с учетом сегодняшнего дня современные процессоры совсем не «простые». С помощью прогнозирования ветвлений и параллельных конвейеров вы не можете просто сложить циклы команд и ожидать точного результата.
  3. Ручной подсчет - Это может быть вашей лучшей ставкой, и, хотя она не автоматическая, она может дать лучшие результаты быстрее, чем другие методы. Просто посмотрите на такие вещи, как порядок кода O (), сколько памяти функция читает / записывает, сколько файловых байтов вводится / выводится и т. Д. Имея несколько таких статистических данных для каждой функции / модуля, вы должны быть в состоянии получить грубое сравнение их сложности.
0 голосов
/ 12 ноября 2010

Звучит так, как будто вам нужна программа, которая вычисляет Big-O нотацию фрагмента кода. Я не знаю, возможно ли это сделать автоматизированным способом (проблема остановки и т. Д.).

...