循环中的循环算法
Round robin algorithm in a loop
round-robin算法如何实现永远循环运行?
for (int i = 0; ;i++){
roundRobinIndex = i % numberOfWorkers;
}
上述方法的问题是integer overflow
问题。也可以通过检查 i
:
的值来实现
for (int i = 0; ;i++){
roundRobinIndex = i % numberOfWorkers;
if i == maxNumber{
i = 0;
}
}
但是这种方式看起来很难看。也许有更优雅的方式?
为什么不呢?
int numberOfWorkers = 10
int roundRobinIndex = numberOfWorkers - 1
while(true){
roundRobinIndex = (roundRobinIndex + 1) % numberOfWorkers
}
或使用 for 循环
for (int i = 0; ;i = (i + 1) % numberOfWorkers){
roundRobinIndex = i;
}
我们现在可以去掉 i
为了完整起见(我同意 pLopeGG 的回答更优雅)- 如果你将 i
设为 unsigned int
而不是 int
,你的方法将非常有效,因为定义了溢出在无符号溢出的标准中,但未签名。
即
for (unsigned int i = 0; ;i++){
roundRobinIndex = i % numberOfWorkers;
}
避免任何模调用,我们可以这样做:
constexpr int nextRR(int curIdx, int sz) {
if(curIdx==sz-1) {
return 0;
}
return curIdx+1;
}
for (int rrIndex = 0;;rrIndex = nextRR(rrIndex, sz)) {
// use rrIndex here ...
}
如果在编译时不知道 worker 的数量,这将比任何基于模的解决方案在性能方面更有效。
注意 nextRR
也可以这样写,以进一步优化与 0 比较比与变量比较更快的平台:
constexpr int nextRR(int curIdx, int sz) {
if(curIdx==0) {
return sz-1;
}
return curIdx-1;
}
为什么不将 %
放入循环中?
for (int i = 0; ;++i, i %= numberOfWorkers)
{
}
round-robin算法如何实现永远循环运行?
for (int i = 0; ;i++){
roundRobinIndex = i % numberOfWorkers;
}
上述方法的问题是integer overflow
问题。也可以通过检查 i
:
for (int i = 0; ;i++){
roundRobinIndex = i % numberOfWorkers;
if i == maxNumber{
i = 0;
}
}
但是这种方式看起来很难看。也许有更优雅的方式?
为什么不呢?
int numberOfWorkers = 10
int roundRobinIndex = numberOfWorkers - 1
while(true){
roundRobinIndex = (roundRobinIndex + 1) % numberOfWorkers
}
或使用 for 循环
for (int i = 0; ;i = (i + 1) % numberOfWorkers){
roundRobinIndex = i;
}
我们现在可以去掉 i
为了完整起见(我同意 pLopeGG 的回答更优雅)- 如果你将 i
设为 unsigned int
而不是 int
,你的方法将非常有效,因为定义了溢出在无符号溢出的标准中,但未签名。
即
for (unsigned int i = 0; ;i++){
roundRobinIndex = i % numberOfWorkers;
}
避免任何模调用,我们可以这样做:
constexpr int nextRR(int curIdx, int sz) {
if(curIdx==sz-1) {
return 0;
}
return curIdx+1;
}
for (int rrIndex = 0;;rrIndex = nextRR(rrIndex, sz)) {
// use rrIndex here ...
}
如果在编译时不知道 worker 的数量,这将比任何基于模的解决方案在性能方面更有效。
注意 nextRR
也可以这样写,以进一步优化与 0 比较比与变量比较更快的平台:
constexpr int nextRR(int curIdx, int sz) {
if(curIdx==0) {
return sz-1;
}
return curIdx-1;
}
为什么不将 %
放入循环中?
for (int i = 0; ;++i, i %= numberOfWorkers)
{
}