C ++ Оптимизация на отрицательных целых числах - PullRequest
1 голос
/ 19 марта 2009

Допустим, у нас есть отрицательное целое число, скажем int a;

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

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

Ответы [ 7 ]

26 голосов
/ 19 марта 2009

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

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

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

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

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

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

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

8 голосов
/ 19 марта 2009

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

7 голосов
/ 19 марта 2009

Чтобы уточнить утверждение Пакса,

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

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

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

2 голосов
/ 19 марта 2009

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

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

1 голос
/ 19 марта 2009

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

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

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

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

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

1 голос
/ 19 марта 2009

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

0 голосов
/ 19 марта 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...