Я перебираю книгу на C и там говорится: «Напишите программу, которая насчитывает от 1 до 300 миллионов, печатая число только в том случае, если оно кратно 100 миллионам. Используйте секундомер, чтобы повеселиться на время программы!"

Я не собирался точно рассчитывать время, но без какой-либо оптимизации время GCC составляет около 0,85 секунды, а с оптимизацией - около половины.

Как быстры процессоры? Я предполагаю, что они используют какой-то особый способ подсчета (или это то, как его компилирует gcc?), Но что они делают, чтобы считать так быстро?

2 ответа2

3

Это будет зависеть от вашего определения поста.

Процессор 3Ghz имеет три миллиарда циклов в секунду. Количество инструкций, которые могут быть выполнены за цикл, зависит от многих вещей, включая набор инструкций, ядра, архитектуру и то, какая задача выполняется. Процессоры спроектированы и оптимизированы для максимально возможного выполнения за один цикл.

Но давайте скажем наихудший сценарий - одна инструкция на цикл для этой довольно простой задачи.

Тогда возникает вопрос: «Почему для того, чтобы считать 300 миллионов, нужны полные 0,85 секунды? В конце концов, это простой шаг с тестом на завершение. Это должно занять гораздо меньше времени, чем это.

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

Выньте свой отпечаток и посмотрите, как быстро он работает.

0

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

Инструкция по увеличению вашего счетчика - это всего лишь 1 инструкция, в зависимости от того, как ваш чек на 100 миллионов и как gcc оптимизирует его, проверка может перейти к нескольким инструкциям, что, вероятно, также незначительно, поскольку современные компиляторы имеют прогнозирование на будущее / ветвление, что означает что ваш процессор предположит, что число не кратно 100 миллионам, и будет продолжать увеличивать ваш счетчик до тех пор, пока не получит результат фактического сравнения, а в случае кратности 100 миллионам он откатится к проверке и выполнить оператор печати, который будет сравнительно медленным, так как он должен иметь дело с оборудованием вне процессора.

Таким образом, увеличение количества отпечатков замедлит его двумя способами: 1 оно будет чаще проходить тест, но дополнительное время, затрачиваемое на печать, будет гораздо более значительным.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .