私は現在、指数関数的降下(http://www.acodersjourney.com/2016/02/26-handle-transient-errors-in-c/)の実装に取り組んでいます。結果が限界内になるような最大電力の計算
var delay = (int) Math.Round(Math.Pow(timeBetweenAttempts, attempt), MidpointRounding.AwayFromZero);
明らかに、この遅延も10ミリ秒であるの試行の間の時間で、非常に迅速に、非常に大規模な取得を開始:
は、私はそのようなことを、遅延が待機するように計算しています。
私は似た何かをできるようにしたいと思います:
var maxTimeBetweenAttempts = 5000; // 5 seconds is the hard limit
var nominalTimeBetweenAttempts = 10;
var maxNumberOfAttempts = // calculate the maximum number of raises that would hold below 5000.
明らかにこれは、ループを使用して計算することができますが、これを行うには、よりエレガントな方法があった場合、私は不思議でしたか?
理由だけではなく、 '' Math.Min(遅延、maxTimeBetweenAttempts)を使用していませんか? –
'pow(x、n)'の代わりに 's * pow(x/s、n)'という遅延ファミリが必要です。許容可能な最大のnは、 '(log(maxdelay)-log(s))/(log(x)-log(s))であるlog(maxdelay/s)/ log )) ')。実際には、あなたは既にあなたの好みのユニットによって暗黙のうちに選択された倍率を持っています。 10ミリ秒と.01秒の時間は同じですが、 'pow(.01、n)'を実行した場合、遅延は「n」が増えるにつれて*短縮されます。 –
@ScottChamberlain:それは "遅延が非常に速く大きくなる"という問題を解決しないためです。 –