レート制限を目的とした関数のスロットルとデバウンスの違いについて、誰でも簡単に説明できますか?
私には両方とも同じことをしているようです。私はこれらの2つのブログを調べて確認しました。
http://remysharp.com/2010/07/21/throttling-function-calls
http://benalman.com/projects/jquery-throttle-debounce-plugin/
レート制限を目的とした関数のスロットルとデバウンスの違いについて、誰でも簡単に説明できますか?
私には両方とも同じことをしているようです。私はこれらの2つのブログを調べて確認しました。
http://remysharp.com/2010/07/21/throttling-function-calls
http://benalman.com/projects/jquery-throttle-debounce-plugin/
回答:
簡単に言えば:
頻繁に呼び出される関数がある場合-たとえば、サイズ変更またはマウス移動イベントが発生した場合、それは何度も呼び出される可能性があります。この動作を望まない場合は、スロットルして、関数が定期的に呼び出されるようにすることができます。デバウンスとは、一連のイベントの終了時(または開始時)に呼び出されることを意味します。
個人的に、スロットルよりもデバウンスを理解するのは難しいと感じました。
どちらの関数も、実行を延期し、実行率を下げるのに役立ちます。スロットル/デバウンスによって繰り返し返される装飾された関数を呼び出していると仮定します...
デバウンスの最後の部分は、達成しようとしている目標を理解するために重要であることがわかりました。_.debounceの実装の古いバージョンも理解に役立ちます(https://davidwalsh.name/function-debounceの好意による)。
// Returns a function, that, as long as it continues to be invoked, will not
// be triggered. The function will be called after it stops being called for
// N milliseconds. If `immediate` is passed, trigger the function on the
// leading edge, instead of the trailing.
_.debounce = function(func, wait, immediate) {
var timeout;
return function() {
var context = this, args = arguments;
var later = function() {
timeout = null;
if (!immediate) func.apply(context, args);
};
var callNow = immediate && !timeout;
clearTimeout(timeout);
timeout = setTimeout(later, wait);
if (callNow) func.apply(context, args);
};
};
遠く離れた比喩ですが、おそらく役立つかもしれません。
IMを介してあなたと話すのが好きなChattyという友達がいます。彼女が話すとき、5秒ごとに新しいメッセージを送信し、IMアプリケーションアイコンが上下にバウンドしていると仮定すると、...
違い
+--------------+-------------------+-------------------+
| | Throttle 1 sec | Debounce 1 sec |
+--------------+-------------------+-------------------+
| Delay | no delay | 1 sec delay |
| | | |
| Emits new if | last was emitted | there is no input |
| | before 1 sec | in last 1 sec |
+--------------+-------------------+-------------------+
ユースケースによる説明:
検索バー-ユーザーがキーを押すたびに検索したくないですか?ユーザーが入力を1秒間停止したときに検索したい。debounceキーを押してから1秒を使用します。
シューティングゲーム-ピストルは各ショットの間に1秒かかりますが、ユーザーはマウスを複数回クリックします。throttleマウスクリックで使用します。
役割を逆にする:
検索バーで1秒スロットル -ユーザーabcdefghijがのすべての文字で入力した場合0.6 sec。次に、スロットルを最初にa押すとトリガーされます。次の1秒間はすべてのプレスをb無視します。つまり、0.6秒では無視されます。その後c、1.2秒で再びトリガーされ、時刻が再びリセットされます。したがってd無視され、eトリガーされます。
1秒間ピストルを跳ね返す-ユーザーが敵を見つけたとき、マウスをクリックしますが、発砲しません。彼はその秒で数回もう一度クリックしますが、それは撃ちません。彼はまだ弾丸が付いているかどうかを確認し、その時点(最後のクリックから1秒後)にピストルが自動的に発砲します。
スロットル(1秒):こんにちは、私はロボットです。あなたが私にpingを送り続ける限り、私はあなたに話し続けますが、正確にそれぞれ1秒後に。1秒経過する前にpingを送信しても、1秒間隔で返信します。つまり、正確な間隔で返信するのが大好きです。
デバウンス(1秒):こんにちは、私は^^ロボットのいとこです。あなたが私にpingを送信し続ける限り、最後にpingを送信してから 1秒が経過した後にのみ返信するので、私は沈黙します。態度に問題があるのか、人を邪魔したくないだけなのかはわかりません。つまり、最後の呼び出しから1秒が経過する前に応答を要求し続けると、応答は得られません。ええええ...どうぞ!失礼と呼んでください。
スロットル(10分):私はロギングマシンです。私は、定期的に10分間隔でシステムログをバックエンドサーバーに送信します。
デバウンス(10秒):こんにちは、私はそのロギングマシンのいとこではありません。(すべてのデバウンサーがこの架空の世界のスロットルに関連しているわけではありません)。私は近くのレストランでウェイターとして働いています。注文にアイテムを追加し続ける限り、注文の執行のためにキッチンに行くことはありません。最後に注文を変更してから10秒が経過した場合にのみ、注文が完了したと見なします。そうして初めて、私はあなたの注文をキッチンで実行します。
クールなデモ:https : //css-tricks.com/debouncing-throttling-explained-examples/
ウェイターの類推のクレジット:https : //codeburst.io/throttling-and-debouncing-in-javascript-b01cad5c8edf
それは簡単です。
スロットルが呼び出されている間、ラップされた関数が定期的に実行され、デバウンスは実行されないことを除いて、これらはまったく同じことを行います(レート制限)。デバウンスは、最後に一度だけ関数を(試行して)呼び出します。
例:スクロールしている場合、スロットルはスクロール中(Xミリ秒ごと)にゆっくりと関数を呼び出します。デバウンスは、スクロールが完了して関数を呼び出すまで待機します。
素人の言葉で:
デバウンスを使用すると、関数が頻繁に呼び出されている間に関数が実行されなくなります。デバウンスされた関数は、呼び出されなくなったと判断された後にのみ実行されます。その時点で、関数は1回だけ実行されます。デバウンスの実用的な例:
ユーザーが「タイピングを中止」した場合のテキストフィールドの内容の自動保存または検証:操作は一度だけ行われ、ユーザーがタイピングを停止している(キーを押していない)と判断された後に実行されます。
ユーザーがマウスを置いた場所のログ:ユーザーはマウスを動かしていないため、(最後の)位置をログに記録できます。
スロットリングは、呼び出し頻度に関係なく、最近実行された関数が実行されるのを防ぎます。スロットルの実用的な例:
個人的に覚えておくのに役立つ実際の例え:
デバウンスの使用例:
スロットルの使用例:
lodashライブラリは、次の資料を示唆https://css-tricks.com/debouncing-throttling-explained-examples/との違いを説明する詳細なDebounceとThrottle、その発信を
スロットル
スロットルは、関数を時間外に呼び出すことができる最大回数を強制します。「この関数は最大で100ミリ秒に1回実行する」のように。通常の状況では、この関数を10秒間に1,000回呼び出すとします。100ミリ秒に1回だけスロットルすると、その関数は最大で100回しか実行されません。
(10s * 1,000) = 10,000ms
10,000ms / 100ms throttling = 100 maximum calls
デバウンス
デバウンスは、関数が呼び出されずに一定の時間が経過するまで関数が再度呼び出されないようにします。「この関数が呼び出されずに100ミリ秒が経過した場合にのみこの関数を実行する」のように。
おそらく、関数は3秒間に分散されたクイックバーストで1,000回呼び出され、その後呼び出されなくなります。100ミリ秒でデバウンスした場合、バーストが終了すると、関数は3.1秒に1回だけ実行されます。バースト中に関数が呼び出されるたびに、デバウンスタイマーがリセットされます
ソース:- スロットルとデバウンス
イベント「E」で呼び出されるコールバック関数「cb」があるとします。「E」が1秒間に1000回トリガーされるとすると、「cb」への呼び出しは1000回になります。つまり、1コール/ミリ秒です。最適化するには、次のいずれかを使用できます。