Идея о том, что <<
быстрее умножения, обосновывается так, как будто JIT-компилятор .NET на самом деле является плохо оптимизированным C-компилятором, написанным в 1970-х годах.Даже если бы это было правдой, разница будет измеряться в пикосекундах в этот момент времени, даже если бы была разница, которой, вероятно, нет.
Пишите код, чтобы его было легко читать .Пусть компилятор позаботится о пико-оптимизации.Оптимизируйте свой код на основе профилирования реалистичных сценариев, а не на втором угадывании, что сгенерирует компилятор.
Более того, операторы сдвига не имеют ту же семантику, что и умножение.Например, рассмотрим следующую последовательность правок:
Оригинальная программа Джилл:
int x = y * 2;
Редактирование Бобом: Глупая Джилл, я сделаю это "быстрее":
int x = y << 1;
Редактирование Ларри Стажером: О, у нас есть ошибка, мы на единицу, позвольте мне исправить это:
int x = y << 1 + 1;
, и Ларри только что представил новую ошибку.y * 2 + 1 отличается от y << 1 + 1;последний на самом деле у * 4. </p>
Я видел эту ошибку в реальном живом производственном коде .Мысленно очень легко понять, что «сдвиг - это умножение», и забыть, что сдвиг имеет меньший приоритет , чем сложение, тогда как умножение более высокий приоритет .
Я никогда не видел, чтобы кто-то неправильно понимал арифметический приоритет, умножив его на два, написав x * 2. Люди понимают приоритет + и *.Многие люди забывают, каков приоритет смены.Пикосекунды, которые вы на самом деле не экономите стоит какого-либо количества потенциальных ошибок?Я говорю нет.