По всей вероятности, это будет зависеть от ситуации, и разница может даже не быть заметной.
Такие факторы, как исполнение не по порядку , скорее всего,скрыть любую присущую «медлительность» любой из версий, если только на самом деле нет узкого места.
Тем не менее, если бы нам пришлось выбирать, что быстрее, то вы правы, что второй случай, скорее всего, будет быстрее.
Если мы посмотрим на таблицы Агнера Фога для всех текущих процессоров x86:
Core 2:
add/sub r, r/i Latency = 1 , 1/Throughput = 0.33
add/sub r, m Latency = unknown , 1/Throughput = 1
Нехалем:
add/sub r, r/i Latency = 1 , 1/Throughput = 0.33
add/sub r, m Latency = unknown , 1/Throughput = 1
Песчаный мост:
add/sub r, r/i Latency = 1 , 1/Throughput = 0.33
add/sub r, m Latency = unknown , 1/Throughput = 0.5
K10:
add/sub r, r/i Latency = 1 , 1/Throughput = 0.33
add/sub r, m Latency = unknown , 1/Throughput = 0.5
Во всех случаях версия с операндом памяти имеет меньшую пропускную способность.Задержка неизвестна во всех случаях, но почти наверняка будет более 1 цикла.Так что это хуже во всех отношениях.
Версии операндов памяти используют все те же порты выполнения, что и непосредственная версия +, для этого также требуется порт чтения памяти.Это может только ухудшить ситуацию.Фактически, именно поэтому пропускная способность ниже с операндом памяти - порты памяти могут выдерживать только 1 или 2 чтения / цикл, тогда как сумматор может поддерживать полный 3 / цикл.
Кроме того, это предполагает, что данныенаходится в кеше L1.Если это не так, то версия операнда памяти будет НАМНОГО медленнее.
Сделав еще один шаг вперед , мы можем проверить размерзакодированные инструкции:
add eax,val1 -> 03 05 14 00 00 00
add eax,10000h -> 05 00 00 01 00
Кодировка для первого может немного отличаться в зависимости от адреса val1
.Примеры, которые я показал здесь, взяты из моего конкретного тестового примера.
Таким образом, версия доступа к памяти требует дополнительного байта для кодирования - что означает немного больший размер кода - и, возможно, больше i-cache пропускает приextreme.
Итак, в заключение, если существует разница в производительности между версиями, вполне вероятно, что немедленная версия будет быстрее, потому что:
- Она имеет меньшую задержку.
- У него более высокая пропускная способность.
- У него более короткая кодировка.
- Ему не требуется доступ к кэшу данных, что потенциально может привести к потере кеша.