Упрощенный алгоритм для вычисления остающегося пространства в кольцевом буфере?

Вы можете легко достичь этого, используя AWS CloudFront. Используйте поведения, чтобы выбрать источник на основе пути. CloudFront имеет встроенную интеграцию с S3.

7
задан Toon Krijthe 16 January 2009 в 14:37
поделиться

4 ответа

Если Вы волнуетесь по поводу плохо предсказанных условных выражений, замедляющих конвейер Вашего ЦП, Вы могли бы использовать это:

int remaining = (end - start) + (-((int) (end <= start)) & bufferSize);

Но это, вероятно, будет преждевременной оптимизацией (если Вы действительно не идентифицировали это как горячую точку). Придерживайтесь своей текущей техники, которая намного более читаема.

8
ответ дан 6 December 2019 в 10:54
поделиться

Хм....

int remaining = (end - start + bufferSize) % bufferSize;

13 маркеров, я побеждаю?

6
ответ дан 6 December 2019 в 10:54
поделиться

Согласно Стандарту C++, разделите 5.6, абзац 4:

Двоичный файл / оператор приводит к частному, и двоичный оператор % приводит к остатку от подразделения первого выражения вторым. Если второй операнд / или % является нулем, поведение не определено; иначе (a/b) *b + a%b равен a. Если оба операнда являются неотрицательными затем, остаток является неотрицательным; в противном случае знак остатка определяется реализацией.

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

Поэтому (end - start) % bufferSize подходы не работают надежно. C++ не имеет арифметики в остаточных классах (кроме смысла предлагаемой неподписанными целочисленными типами).

Подход, рекомендуемый j_random_hacker, отличается, и выглядит хорошим, но я не знаю, что это - любое фактическое улучшение простоты или скорости. Преобразование булевской переменной к интервалу оригинально, но требует умственного парсинга, и что игра могла быть более дорогой, чем использование?: в зависимости от компилятора и машины.

Я думаю, что у Вас есть самая простая и лучшая версия тут же, и я не изменил бы ее.

2
ответ дан 6 December 2019 в 10:54
поделиться

Потеряйте условное выражение:

int remaining = (end + bufferSize - start - 1) % bufferSize + 1

Править: -1 и +1 для случая когда end == start. В этом случае этот метод предположит, что буфер пуст. В зависимости от определенной реализации Вашего буфера Вы, возможно, должны скорректировать их для предотвращения off-1 ситуации.

0
ответ дан 6 December 2019 в 10:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: