TL; DR: Все зависит от кода и того, что делает компилятор asm. Я предполагаю, что недавний MacBook использует процессор Intel Haswell, поэтому я использовал это в качестве примера.
Обновление: Я не заметил, что вы сказали Java. Возьмите всю неопределенность и размахивание руками в тексте ниже и сделайте квадрат, потому что хороший JIT-компилятор будет использовать динамическую информацию, чтобы делать вещи, такие как сначала проверить наиболее распространенное условие. Оптимизация кода для данных, на которых он фактически работает, может иметь большое значение, особенно. для небольшого цикла, который работает в течение длительного времени.
Сопоставление инструкций C с инструкциями asm нигде не приближается к 1: 1. В зависимости от проверяемых условий компилятор может комбинировать некоторые тесты вместе или даже не использовать ветви.
Если выражение в состоянии if()
является сложным, для его оценки обычно требуется несколько инструкций. Каждое предложение, разделенное &&
или ||
, может привести к отдельной условной ветви для реализации оценки короткого замыкания.
Процессоры Intel SnB-семейства могут поддерживать пропускную способность четырех часов в час. Intel Haswell и более поздние версии могут макро-fuse две пары сравнения и ветвления в каждом блоке декодирования от 4 до 6 команд (по сравнению с одним макро-синтезом за цикл в предыдущих ургах). (См. Agner Fog's microarch pdf и другие материалы в теге x86). Поэтому теоретически процессор Haswell может выпускать 3 пары пар сравнения и ветвлений за такт. Он может выполнять только две условные ветки за такт, хотя (пока они оба правильно предсказаны, и по крайней мере один из них не принят).
Вы можете использовать перфорированные счетчики, чтобы узнать, насыщает ли ваш порт порт6 (взятые ветви) или порты 0 и 6 (невозбранные ветви). Или, скорее, вы страдаете от киосков трубопровода из-за неверных прогнозов отрасли.
Глядя на выход asm из компилятора, это один из первых шагов к тому, что компилятор может сделать из вашего кода. Иногда это может помочь вам увидеть исходные изменения, которые заставят этот конкретный компилятор исправить лучший код. Иногда вы можете увидеть более оптимальный путь для потока asm и можете написать источник таким образом, который отражает это, что, надеюсь, поможет любому компилятору.
Попробуйте синхронизировать его с меньшим количеством итераций, а затем определите, сколько времени потребуется с заданным количеством итераций. –
Я думаю, вам следует больше беспокоиться о работе, выполняемой в теле петель. И кроме того, если-инструкции, увеличивающие счетчики циклов и доступ к памяти, также требуют времени.Это также зависит от выбранного вами языка программирования. – Felix
# 1 правило тестирования производительности: измерение. То есть: попробуйте. Все остальное составлено. –