28 мар. 2007 г.

CPU vs Memory ?

Если посмотреть внимательно на метод signum в java.lang.Integer, вычисляющим знак целого числа можно увидеть :
    public static int signum(int i) {
// HD, Section 2-7
return (i >> 31) | (-i >>> 31);
}

вместо ожидаемого
    public static int signum(int i) {
return i > 0 ? 1 : i < 0 ? -1 : 0;
}

В первом случае используется дополнительно две ячейки памяти, во втором случае больше используется cpu. Тесты показывают, что в java такая реализация не случайна - такое вычисление знака целого числа быстрее... на ~ 5%.

Задавшись вопросом - почему я помню не всю таблицу умножения, а только какие-то узловые точки. Например - я не помню, сколько будет 6 * 9, я помню, что 6 * 9 = 6 * 10 - 6, т.е (6 << 1)10 - 6. Или сколько будет 5 * n ? Проще сказать, что это 10 * n / 2 т.е (n << 1)10 / 2. Хотя квадраты, конечно же, прожжённое на вечную память.

Почему мы так старательно оптимизируем память, сокращая различные ассоциативные таблицы (карты памяти), превращая их в инструкции для cpu ?