измерение реального времени работы алгоритма - PullRequest
1 голос
/ 02 апреля 2011

Примерно сколько физических инструкций MIPS амортизирует операция абстрактного алгоритма?Что касается операции абстрактного алгоритма , я имею в виду базовую операцию , например сложение , деление и т. Д.

Я вижу, что это не строгая методика измерения: -)

Kejia

Ответы [ 4 ]

1 голос
/ 12 апреля 2011

Дональд Кнут обратился к этой самой проблеме, написав первый том «Искусства компьютерного программирования». В предисловии он дает длинное обоснование для представления алгоритмов в коде ассемблера для воображаемой машины -

... Чтобы избежать этой дилеммы, у меня есть попытался разработать "идеал" компьютер под названием " MIX, " с очень простые правила работы ...

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

1 голос
/ 02 апреля 2011

Список основных инструкций MIPS здесь . Большинство упомянутых вами «базовых операций» представляют собой одну или две инструкции MIPS, что, вероятно, относится к большинству современных семейств процессоров.

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

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

Распространенным и довольно понятным примером является эффект кеша инструкций. Развертывание цикла устраняет ряд операций ветвления, что интуитивно ускоряет работу кода. Однако если вы выполняете этот код на процессоре того же семейства с очень небольшим объемом кэш-памяти команд, добавленный доступ к основной памяти может сделать его намного медленнее, чем простой цикл на основе ветвлений.

1 голос
/ 02 апреля 2011

Это зависит от архитектуры процессора. Некоторым процессорам требуется несколько циклов для одной инструкции, такой как деление, в то время как другим удается выполнить все инструкции машинного кода за один цикл.

Иногда уместно измерить алгоритм, сколько операций с плавающей запятой ему требуется. Однако это не учитывает ввод-вывод (например, чтение памяти).

Скорость ЦП иногда указывается в FLOPS (операциях с плавающей запятой в секунду), которые могут помочь вам оценить время. Опять же, не принимая во внимание ввод / вывод - и не вопросы многопоточности (также очень важный фактор измерения).

1 голос
/ 02 апреля 2011

Компьютеры сложны. Если вы хотите перейти на этот уровень, вам нужно начать думать о том, какой тип процессора вы используете, насколько хорошо ваш компилятор может использовать этот набор команд этого процессора, какие переменные хранятся в каких регистрах, каковы их представления на уровне битов, и т.д. Даже в этом случае количество инструкций не всегда легко сопоставляется с фактическим временем выполнения. Разные инструкции могут потребовать различного количества тактов для выполнения, и это даже не думает о многопоточности ОС и частоте ошибок кэша вашей программы.

В конце концов, есть веская причина, по которой мы в первую очередь используем нотатион big-O:)


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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...