Не существует основного списка для всех языков, типов данных, процессоров и т. Д., Поскольку существует слишком большая изменчивость.
В некоторых языках операторы являются просто синтаксическим сахаром для полных динамически определяемых вызовов функций с диспетчеризацией типов, поэтому «a + b» может оказаться сложным вызовом функции, который занимает минуты, а «a * b» может простой вызов функции, который занимает миллисекунды или наоборот.
В языках, которые имеют фиксированные типы во время компиляции (включая C ++, а также C, даже если C ++ имеет перегрузку), вы можете определить во время компиляции, что будет вызываться, что помогает во многом разобраться, но все же не дает вам окончательного ответа. (См. Также ответы Дана Д. и Алекса.)
«Операторы дополнения» (+ = и т. Д.) Обычно являются просто сокращением для операции присваивания после расширения. Фактическая операция занимает столько же времени. В языках с динамической диспетчеризацией типов иногда вы также отключаете некоторую вспомогательную (не операторную) работу, поскольку операции дополнения нужно только один раз найти тип переменной. При статической типизации (во время компиляции), если компилятор достаточно умный, простые операции типа a += b
никогда не сохраняют что-либо сверх a = a + b
во время выполнения, их просто легче читать. Более сложные случаи, такие как p->q->r->s += t
, могут реально сэкономить время, поскольку (в сложных случаях) оценку p->q->r->s
необходимо выполнять повторно, если она записана повторно.
Что касается базовых операций с ЦП, существуют некоторые практические правила, но вы должны изучить соответствующие руководства по ЦП, чтобы увидеть, какие из них применимы:
- Для целых чисел сложение, вычитание и логические операции, такие как и / или / xor, никогда не выполняются медленнее, чем любая другая операция
- Для целых чисел умножение «сложнее» сложения, т. Е. Может быть медленнее сложения и т. Д., Но все же может быть очень быстрым, если для него выделена достаточная мощность процессора; и деление может быть медленнее, чем умножение, или все еще может быть быстрым
- Для операций с плавающей запятой сложение и вычитание «сложнее», чем умножение и деление, поэтому они могут быть медленнее (или нет, опять же, это зависит от того, сколько транзисторного пространства там выделено для FPU)
- Если нет FPU, с плавающей запятой, скорее всего, медленнее, чем целое число
- Если имеется сдвиг ствола или воронки, сдвиги всегда бывают быстрыми, но если нет, сдвиги могут занять больше времени в зависимости от того, «насколько далеко» смещается (например, x >> 4 может быть медленнее, чем x >> 1)
- В современных ЦП планирование команд @Alex, упомянутое выше, может зависеть или не зависеть от порядка команд, например, оно может помочь в распределении инструкций FPU среди команд целочисленных единиц (или не может)
- Эффекты кеширования (включая размещение веток вблизи определенных точек в строках кеша, а также пропуски многоуровневого кеша, а также пропуски TLB) могут полностью ослабить эффекты тщательного планирования команд на некоторых процессорах
Подобные вещи усложняют написание современных оптимизаторов компиляторов. : -)