7

Когда код ожидает некоторого состояния, в котором время задержки не является детерминированным, похоже, что многие люди предпочитают использовать экспоненциальное отключение, т. Е. Ждать N секунд, проверить, удовлетворяет ли условие; если нет, подождите 2N секунд, проверьте состояние и т. д. В чем преимущество этого при проверке в постоянном/линейно увеличенном временном интервале?В чем преимущество использования экспоненциального отсрочки?

+2

Это кажется довольно вне темы для StackOverflow. Преимущество состоит в том, что экспоненциальное увеличение задержки приведет к значительному значительному количеству общих проверок. Это значительно повышает производительность, если для проверки требуется большая вычислительная мощность или пропускная способность интернета. – Cristy

+0

Зачем это не по теме? Я не обязательно не согласен, но никаких объяснений не было. Я за один нашел вопрос и ответы полезными. – filmil

ответ

3

Это поведение контроля перегрузки TCP. Если сеть чрезвычайно перегружена, фактически трафик не проходит. Если каждый узел ждет постоянное время перед проверкой, трафик только для проверки будет продолжать забивать сеть, и перегрузка никогда не будет решена. Аналогично для линейного увеличения времени между проверками может потребоваться много времени, прежде чем перегрузка будет решена.

2

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

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

  1. размера окна, где большинство операций успеха, как правило, быть в два раз наименьшего размера окна, где большинство операций будет успешным,

  2. Большинство операций, которые не выполняются при этом размере окна, будут успешными с последующей попыткой (так как большинство предыдущих операций будут выполнены успешно, что позволит оставить менее половины они конкурируют за окно, которое в два раза больше), и

  3. Общее время, необходимое для всех попыток, будет в два раза больше, чем требуется для последнего.

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

1

Предполагая, что вы имеете в виде тестирования состояния перед выполнением действия:

  • Экспоненциальных отсрочек выгодно, когда стоимость проверочного сравнима со стоимостью выполнения действия (например, в перегрузке сети) ,
  • Если стоимость тестирования условия намного меньше (или незначительна), то линейное или постоянное ожидание может работать лучше, если время, необходимое для изменения условия, также не имеет значения.

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

Но если условие - это просто облегченная проверка памяти (fi критический раздел), и действие по-прежнему является обновлением базы данных (в лучшем случае десятки тысяч раз медленнее, чем проверка), и если условие перевернулось в ничтожное время в самом начале действия (введя критический раздел), тогда постоянная или линейная отсрочка была бы прекрасной. Фактически в этом конкретном сценарии экспоненциальная отсрочка будет пагубной, так как это приведет к задержкам в ситуациях с низкой нагрузкой и, скорее всего, приведет к тайм-аутам в ситуациях высокой нагрузки (даже если ширина полосы обработки достаточна).

Итак, подведет итог, экспоненциальная потеря мощности молоток: он работает великие человек для ногтей, не так много для винтов :)

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