2015-12-15 4 views
4

Теоретически, на современных процессорах, которые быстрее:Что быстрее для побитового NOT операции: предварительно вычислены таблицы или `~`

  • прием не приводит из таблицы
  • или расчета его ~ (в C) операции ?

Предполагая, что вся таблица подходит для кеша L1.

побитовое не:

uint8_t bitwise_not(uint8_t arg) { return ~arg; } 

Таблица нет:

// precalculcating table (once) 
uint8_t table[0x100]; 
for (int i = 0; i < 0x100; ++i) { table[i] = ~static_cast<uint8_t>(i); } 

// function 
uint8_t table_not(uint8_t arg) { return table[arg]; } 

// xor_not: 
uint8_t xor_not(uint8_t arg) { return arg^0xff; } 

На не одну операцию, а несколько миллиардов операций, читает из кэша L1 быстрее, чем любой логической операции или нет? (Я думаю, что L1 быстрее, но не может это доказать.)

Практически, как измерить его?

+2

Вы пытались сравнить код? Вероятно, было бы легче, если бы кто-то указал на ошибку в методе бенчмаркинга, вместо того, чтобы писать для вас ориентир. –

+0

@ JonnyHenly Как правильно сравнивать его? Для обеих функций он всегда измеряется до 1 нс. Подсчет тактов процессора ('rdtsc') неправильный метод для измерения, потому что количество тактов ничего не говорит о времени выполнения (в 2015 году). – vladon

+0

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

ответ

11

Ни то, ни другое. Просто используйте оператор ~ inline в коде. Это одна машинная инструкция. Вызов функции или поиск таблицы несколько. Не может быть и того, и другого.

Я не могу объяснить ваше странное убеждение, что кеш L1 быстрее регистра.

+0

Предположим, что функции встроены в компилятор. Я не спрашиваю, что использовать, это больше вопрос теории. – vladon

+0

Мой ответ остается тем же. – EJP

+0

Да, это очевидный ответ, поэтому +1. Предполагая, конечно, что конкретный процессор _has_ машинная инструкция для этого, что, как мне сказали, может не обязательно быть верным для небольших встроенных систем. Для подобного обсуждения рассмотрите комментарии здесь: http://stackoverflow.com/a/33910543/15727 - поэтому я думаю, что более длинный ответ начнется с «это зависит». Но это обсуждение было обратным, а не обратным, поэтому, возможно, все процессоры имеют побитовое указание? –

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

  • Нет связанных вопросов^_^