делать что-то необычным, но эффективным способом - PullRequest
7 голосов
/ 06 ноября 2010

Я смотрел видео сегодня, и парень на видео просто пишет это, чтобы понять, является ли число четным или нет:

number/2*2 == number ? true : false ; 

Я попробовал его, когда вернулся домой, и сравнил с

number % 2 == 0 ? true : false ; 

Второй был быстрее, тогда я изменил первый следующим образом:

number>>1<<1 == number ? true : false; 

на этот раз сдвиг числа один раз вправо и один раз влево работал быстрее: D Разница в производительности невеликавсего 0-1 секунда для определения всех чисел от 1 до 1000000000, но мне это очень понравилось и я хотел услышать от вас такие трюки.

и что еще?=)

и еще одна идея от Рассела Борогове =)

(number&1) == 0;

Результаты:

Время, прошедшее с и операция: 00: 00: 07.0504033
Время, прошедшее сОперация сдвига: 00: 00: 06.4653698
Время, прошедшее с модом Операция: 00: 00: 06.8323908

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

Ответы [ 2 ]

7 голосов
/ 06 ноября 2010

MIT фактически хранит список таких вещей, HAKMEM, который можно найти по адресу http://www.inwap.com/pdp10/hbaker/hakmem/hakmem.html. Большинство связанных с программированием написаны на ассемблере, но я понимаю, что некоторые из них были переведены на C на http://graphics.stanford.edu/~seander/bithacks.html.

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

Большинство вычислений не настолько критично для производительности, что подобные трюки необходимы. В нечетно-четном случае, number % 2 == 0 намного яснее и читабельнее, чем number/2*2 == number или number>>1<<1 == number. Тем не менее, в обычных приложениях вы всегда должны использовать более простой и более стандартный вариант, потому что он облегчит понимание и поддержку вашего кода.

Однако для подобных уловок есть варианты использования. Такие трюки могут спасти вашу жизнь, особенно в крупномасштабных математических или научных вычислениях и компьютерной графике. Прекрасным примером этого является «магический обратный квадратный корень» Джона Кармака в Quake 3.

1 голос
/ 24 марта 2011

Книга Восхищение Хакера - это 300 страниц ничего подобного. Это не дешево, но это библейская библия.

...