Вообще говоря, они выполняют ту же работу. Тем не менее, нотация в виде скобок дает вам возможность делать то, что вы не можете сделать с точечной нотацией, например
var x = elem["foo[]"]; // can't do elem.foo[];
. Это можно расширить до любого свойства, содержащего специальные символы.
Проблема со спящим постоянным количеством в 1 секунду после каждой передачи заключается в том, что у вас будет прерывистая производительность сети.
Пусть BandwidthMaxThreshold является искомым пределом полосы пропускания.
Пусть TransferRate является текущей скоростью передачи соединения.
Затем ...
Если вы обнаружите свой TransferRate> BandwidthMaxThreshold, вы выполните SleepTime = 1 + SleepTime * 1.02 (увеличьте время сна на 2%)
До или после каждой сетевой операции выполните Sleep (SleepTime)
Если вы обнаружите, что ваш TransferRate намного ниже, чем ваш BandwidthMaxThreshold, вы можете уменьшить время сна. В качестве альтернативы вы всегда можете разлагать / уменьшать время сна. В конце концов ваш SleepTime снова достигнет 0.
Вместо увеличения на 2% вы также можете увеличить линейное увеличение разницы между TransferRate - BandwidthMaxThreshold.
Это решение хорошо, потому что у вас не будет спит, если сеть пользователя уже не так высока, как хотелось бы.
Лучшим способом было бы использовать ковш маркера .
Передавать только тогда, когда у вас достаточно токенов для заполнения пакета (1460 байт было бы хорошим количеством) или если вы принимаете сторону, читайте из сокета только тогда, когда у вас достаточно токенов; немного простая математика расскажет вам, сколько времени вам нужно ждать, прежде чем у вас будет достаточно токенов, чтобы вы могли спать с таким количеством времени (будьте осторожны, чтобы рассчитать, сколько жетонов вы получили от того, сколько вы на самом деле спал, так как большинство операционных систем могут спать ваш процесс дольше, чем вы просили).
Чтобы управлять размером пакетов, ограничьте максимальное количество токенов, которые вы можете иметь; хорошее количество может быть на одну секунду для токенов.
Мне повезло с trickle . Это классно, потому что он может дросселировать произвольные пользовательские приложения без изменений. Он работает, предварительно загружая собственные функции оболочки send / recv, которые делают для вас расчет пропускной способности.
Самый большой недостаток, который я нашел, заключался в том, что сложно согласовать несколько приложений, которые вы хотите использовать для конечной полосы пропускания. «trickled» помогает, но мне было сложно.
Обновление в 2017 году: похоже, что тряска переместилась на https://github.com/mariusae/trickle