У разных операторов разное количество процессоров? - PullRequest
0 голосов
/ 15 марта 2012

Я не знаю, как напечатать это в Google, поэтому я спрашиваю это здесь.

В программировании операторы занимают разное время или загружают процессор? Например, будет:

x = y + z

занимает меньше времени / ресурсов, чем:

x = y * z

Я знаю, что это не заметно, если вообще. Просто любопытный вопрос.

Кроме того, если бы вы могли включить как можно больше операторов, таких как + =, - =, * = и / = вместе со всеми обычными операторами.

Спасибо!

Ответы [ 3 ]

3 голосов
/ 15 марта 2012

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

В некоторых языках операторы являются просто синтаксическим сахаром для полных динамически определяемых вызовов функций с диспетчеризацией типов, поэтому «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) могут полностью ослабить эффекты тщательного планирования команд на некоторых процессорах

Подобные вещи усложняют написание современных оптимизаторов компиляторов. : -)

1 голос
/ 15 марта 2012

Вам нужно проверить руководство по ЦПУ и посмотреть, какие существуют логические и арифметические инструкции и сколько циклов они выполняют для выполнения.

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

Некоторые процессоры не имеют инструкций для плавающихточечная арифметика, которая означает, что все операции с плавающей точкой должны быть построены с использованием инструкций, работающих с целыми числами, и поэтому они будут сравнительно медленнее, чем аналогичные операции над целыми числами.рассматриваемые инструкции могут быть сопряжены с другими процессорами (если вообще возможно сопряжение (параллельное выполнение)).Если они не могут соединиться, они замедлят соседние инструкции.Некоторые процессоры имеют несколько ALU для простых команд, которые могут выполняться одновременно.Помимо простого сопряжения, некоторые сложные инструкции могут использовать больше этапов конвейера ЦП или использовать их иначе, чем простые инструкции, что может задержать выполнение этих других простых инструкций.

Окончательный ответ зависит от вашего ЦП и языка программирования /компилятор / интерпретатор.

1 голос
/ 15 марта 2012

Да, на самых низких уровнях иногда a * b стоит больше, чем a + b, а иногда и наоборот.Это действительно зависит от используемого оборудования и используемого языка.

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

...