2009-03-19 4 views
1

Допустим, что у нас есть отрицательное целое число int a;C++ Оптимизация на отрицательных целых числах

Есть ли более быстрая реализация -a?

Должен ли я выполнять побитовое управление на этом?

+0

быстрее, чем, во всяком случае? –

+3

Немного контекста изменило бы это из вопроса «WTF» на то, что могло бы дать разумный ответ. Возможно, компилятор исключает «-a» в оптимизированных сборках, например «if (-a)» -> «if (a)» и «-a + b» -> «b - a». – Skizz

+0

Операция «alternate» (например, на x86) представляет собой две операции: сначала дополнение (x = ~ x), за которым следует приращение (++ x). Фактический код будет читать x = (int) ((~ (unsigned int) x) +1); X86 включает эти две операции в команде neg (ate). Комбинация двух операций также известна как «дополнение двух». –

ответ

7

Для уточнения о Pax, в компиляторы

C++ не уполномочены использовать двоичное дополнение, за исключением 1 случая. Когда вы конвертируете подписанный тип в неподписанный тип, если число отрицательно, результат преобразования должен быть 2-символьным представлением целого числа.

Короче говоря, существует не более быстрый способ, чем -a; даже если бы они были, это не было бы портативным. Имейте в виду, что преждевременная оптимизация - это зло. Сначала профайлируйте свой код, а затем обработайте узкие места.

См. Язык программирования C++, 3-е изд., раздел C.6.2.1.

+1

Интересный факт о подписании беззнакового преобразования - я об этом не знал. Разумеется, стандарт не описывает это довольно неплохо, легко понять: «если новый тип без знака, значение конвертируется путем многократного добавления или вычитания ...» и т. Д. И т. Д. –

0

Вы видите проблему с производительностью с отрицательными номерами? Я с трудом думаю, что большинство компиляторов будет побитовым против целых чисел, чтобы их отменить.

+0

Возможно, он пишет код, чтобы отслеживать сумму денег на банковском счете AIG, и аппаратное обеспечение не может не отставать от требуемого количества вычитаемых значений. –

+0

Существует городской миф о том, что IRS имеет специальный компьютер только для налоговых деклараций Билла Гейтса (и, предположительно, Buffet's). – paxdiablo

26

Существует почти наверняка ничего более быстрого, чем инструкция NEG машинного кода, что ваш компилятор, скорее всего, включит это.

Если бы это было, я уверен, что компилятор будет использовать его.

Для двухкомпонентного номера вы не можете его добавить и добавить 1, но это почти наверняка будет медленнее. Но я не совсем уверен, что стандарты C/C++ предусматривают использование двухкомпонента (они могут, я не проверял).

Я думаю, что этот вопрос относится к тем, кто пытается переписать strcpy() и др., Чтобы получить больше скорости. Эти люди наивно полагают, что библиотека C strcpy() еще не сильно оптимизирована с помощью специальных инструкций машинного кода (а не упрощенного цикла, который был бы первой попыткой людей).

Проводили ли вы тесты производительности, которые, как представляется, указывают на то, что ваши отрицания слишком долгое время?

< тонко-юмор или-что-моя жена-звонки-неостроумных >

    NEG на 486 (состояние техники в последний раз мне пришлось беспокоиться о тактах) занимает 3 часов циклы (версия памяти, регистрируется только 1) - Я предполагаю, что более поздние фишки будут схожими. На процессоре 3Ghz это означает, что вы можете делать 1 миллиард каждую секунду. Разве это не достаточно быстро?

</тонко-юмор или-что-моя жена-звонки-неостроумных >

+0

Быстрый комментарий: Доступ к памяти для чтения занимает порядка 1-го цикла, поэтому это скорее похоже на 100 или 1000 циклов (из-за обновления памяти). Это делает оптимизацию вопроса еще более бессмысленной. – rlbond

+0

Кроме того, для доступа к памяти требуется переменное количество циклов, в зависимости от того, попадает ли кеш. Пропуски кэша ОЧЕНЬ дороги (относительно говоря). –

+0

Вы не сможете сделать 1 миллиард за одну секунду, если только процессор не выполнит ничего, кроме инструкций NEG, в течение одной секунды, что, вероятно, не будет из-за того, что будут запущены другие приложения, не говоря уже о операционной системе, предоставляющей вам ресурсов ЦП. – dreamlax

8

Вы когда-нибудь слышали фразу "преждевременной оптимизации"? Если вы оптимизировали все вашего кода, и это единственное, что осталось, отлично. Если нет, вы тратите свое время.

+0

Даже если это единственное, что осталось, это, вероятно, пустая трата времени. Дождитесь следующего поколения процессоров (надеюсь, быстрее). – paxdiablo

+0

Точно. Попытка оптимизировать базовую операцию приращения/уменьшения - это трата каждого миллисекунды, которую вы тратите на нее. Это базовая операция на уровне CPU, и люди на заводе-изготовителе процессоров намного шире, чем я. :-) –

1

Возможно, вам стоит подумать об оптимизации ваших алгоритмов больше, чем о таких мелочах.Если это последнее, что нужно оптимизировать, ваш код будет таким же быстрым, как и он.

2

Отрицание числа - это очень простая операция с точки зрения аппаратного обеспечения ЦП. Я не знаю о процессоре, который больше делает отрицание, чем выполнение побитовой операции, и включает в себя 30-летние процессоры.

Любопытно, что привело вас к задаче задать вопрос? Это, конечно, не потому, что вы обнаружили узкое место.

1

Все хорошие ответы.

Если (-a) имеет значение, вы уже сделали некоторую действительно агрессивную настройку производительности.

Эксплуатационная настройка программы - это как получение воды из влажной губки. Поскольку программа впервые написана, она довольно влажная. С небольшим усилием вы можете вырвать у него некоторое время. С большим усилием вы можете высушить его еще немного.

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

Это уровень, на котором (-a) может иметь значение.

+0

+1 для крутая аналогия :) –

Смежные вопросы