Kann mir jemand in einfachen Worten eine Erklärung über den Unterschied zwischen Drosselung und Entprellung einer Funktion zur Geschwindigkeitsbegrenzung geben?
Für mich scheinen beide das Gleiche zu tun. Ich habe diese beiden Blogs überprüft, um herauszufinden:
http://remysharp.com/2010/07/21/throttling-function-calls
http://benalman.com/projects/jquery-throttle-debounce-plugin/
javascript
bhavya_w
quelle
quelle
Antworten:
Einfach ausgedrückt:
Sie können den Unterschied hier visuell sehen
Wenn Sie eine Funktion haben, die häufig aufgerufen wird, z. B. wenn ein Größenänderungs- oder Mausbewegungsereignis auftritt, kann diese häufig aufgerufen werden. Wenn Sie dieses Verhalten nicht möchten, können Sie es drosseln , sodass die Funktion in regelmäßigen Abständen aufgerufen wird. Das Entprellen bedeutet, dass es am Ende (oder am Anfang) einer Reihe von Ereignissen aufgerufen wird.
quelle
Ich persönlich fand debounce schwerer zu begreifen als Drossel .
Da beide Funktionen Ihnen helfen, die Ausführungsrate zu verschieben und zu reduzieren. Angenommen, Sie rufen dekorierte Funktionen auf, die wiederholt durch Gasgeben / Entprellen zurückgegeben werden ...
Ich fand den letzten Teil der Entprellung entscheidend, um das Ziel zu verstehen, das damit erreicht werden soll. Ich fand auch eine alte Version der Implementierung von _.debounce, die das Verständnis erleichtert (mit freundlicher Genehmigung von https://davidwalsh.name/function-debounce ).
Eine weit hergeholte Metapher, könnte aber vielleicht auch helfen.
Sie haben einen Freund namens Chatty, der gerne über IM mit Ihnen spricht. Angenommen, wenn sie spricht, sendet sie alle 5 Sekunden eine neue Nachricht, während Ihr IM-Anwendungssymbol auf und ab springt, können Sie die ...
quelle
Unterschiede
Erläuterung nach Anwendungsfall :
Suchleiste - Sie möchten nicht jedes Mal suchen, wenn der Benutzer die Taste drückt? Möchten Sie suchen, wenn der Benutzer 1 Sekunde lang nicht mehr tippt? Verwenden Sie
debounce
1 Sek. Beim Tastendruck.Schießspiel - Die Pistole benötigt zwischen jedem Schuss 1 Sekunde, aber der Benutzer klickt mehrmals mit der Maus. Verwenden Sie
throttle
bei Mausklick.Umkehren ihrer Rollen :
Drosselung 1 Sek. In der Suchleiste - Wenn Benutzer
abcdefghij
mit jedem Zeichen eingeben0.6 sec
. Dann wird beim erstena
Drücken der Gashebel ausgelöst . Es wird jedes Drücken für die nächsten 1 Sek. Ignoriert, dhb
bei 0,6 Sek. Wird ignoriert. Dann wirdc
nach 1,2 Sekunden erneut ausgelöst, wodurch die Zeit erneut zurückgesetzt wird. Sod
werden ignoriert unde
wird ausgelöst werden.Entprallen der Pistole für 1 Sek. - Wenn der Benutzer einen Feind sieht, klickt er mit der Maus, aber er schießt nicht. Er wird in dieser Sekunde mehrmals klicken, aber es wird nicht schießen. Er wird sehen, ob es noch Kugeln gibt. Zu diesem Zeitpunkt (1 Sek. Nach dem letzten Klick) wird die Pistole automatisch abgefeuert.
quelle
Durch die Drosselung wird erzwungen, wie oft eine Funktion im Laufe der Zeit maximal aufgerufen werden kann. Wie in "Führen Sie diese Funktion höchstens einmal alle 100 Millisekunden aus."
Durch das Entprellen wird erzwungen, dass eine Funktion erst nach einer bestimmten Zeit erneut aufgerufen wird, ohne dass sie aufgerufen wird. Wie in "Führen Sie diese Funktion nur aus, wenn 100 Millisekunden vergangen sind, ohne dass sie aufgerufen wurde."
ref
quelle
Gas (1 Sek.): Hallo, ich bin ein Roboter. Solange du mich anrufst, werde ich weiter mit dir reden, aber nach jeweils genau 1 Sekunde. Wenn Sie mich vor Ablauf einer Sekunde um eine Antwort bitten, werde ich Ihnen weiterhin in einem Intervall von genau 1 Sekunde antworten. Mit anderen Worten, ich antworte einfach gerne in genauen Intervallen.
Debounce (1 Sek.): Hallo, ich bin der Cousin dieses Roboters. Solange du mich anrufst, werde ich schweigen, weil ich nur antworten möchte, nachdem 1 Sekunde vergangen ist, seit du mich das letzte Mal angerufen hast . Ich weiß nicht, ob es daran liegt, dass ich ein Einstellungsproblem habe oder einfach nicht gerne Leute unterbreche. Mit anderen Worten, wenn Sie mich immer wieder um Antworten bitten, bevor 1 Sekunde seit Ihrem letzten Aufruf verstrichen ist, erhalten Sie nie eine Antwort. Yeah yeah ... mach weiter! Nenn mich unhöflich.
Gas (10 min): Ich bin ein Holzfäller. Ich sende Systemprotokolle nach einem regulären Intervall von 10 Minuten an unseren Backend-Server.
Debounce (10 Sek.): Hallo, ich bin kein Cousin dieses Holzfällers. (Nicht jeder Debouncer ist mit einem Throttler in dieser imaginären Welt verwandt). Ich arbeite als Kellner in einem nahe gelegenen Restaurant. Ich sollte Sie wissen lassen, dass ich nicht zur Ausführung Ihrer Bestellung in die Küche gehen werde, solange Sie Ihrer Bestellung etwas hinzufügen. Erst wenn 10 Sekunden vergangen sind, nachdem Sie Ihre Bestellung zuletzt geändert haben, gehe ich davon aus, dass Sie mit Ihrer Bestellung fertig sind. Erst dann werde ich Ihre Bestellung in der Küche ausführen.
Coole Demos: https://css-tricks.com/debouncing-throttling-explained-examples/
Credits für die Kellner-Analogie: https://codeburst.io/throttling-and-debouncing-in-javascript-b01cad5c8edf
quelle
Mit dem Entprellen können Sie die Häufigkeit von Anrufen verwalten, die eine Funktion empfangen kann. Es kombiniert mehrere Aufrufe, die für eine bestimmte Funktion ausgeführt werden, sodass wiederholte Aufrufe, die vor Ablauf einer bestimmten Zeitdauer erfolgen, ignoriert werden. Grundsätzlich stellt das Entprellen sicher, dass genau ein Signal für ein Ereignis gesendet wird, das möglicherweise mehrmals auftritt.
Durch die Drosselung wird die Häufigkeit von Anrufen, die eine Funktion empfängt, auf ein festes Zeitintervall beschränkt. Es wird verwendet, um sicherzustellen, dass die Zielfunktion nicht öfter als die angegebene Verzögerung aufgerufen wird. Drosselung ist die Verringerung der Rate eines sich wiederholenden Ereignisses.
quelle
Es ist einfach.
Sie machen die genau die gleiche Sache (Rate Limiting) , außer während Drossel genannt wird , es wird in regelmäßigen Abständen Ihre gewickelte Funktion ausgelöst, und debounce nicht. Debounce ruft (versucht) Ihre Funktion nur einmal ganz am Ende auf.
Beispiel : Wenn Sie scrollen, ruft Gas Ihre Funktion langsam auf, während Sie scrollen (alle X Millisekunden). Debounce wartet, bis Sie mit dem Scrollen fertig sind, um Ihre Funktion aufzurufen.
quelle
In Laienbegriffen:
Durch das Entprellen wird verhindert, dass eine Funktion ausgeführt wird, während sie noch häufig aufgerufen wird. Eine entprellte Funktion wird erst ausgeführt, nachdem festgestellt wurde, dass sie nicht mehr aufgerufen wird. Zu diesem Zeitpunkt wird sie genau einmal ausgeführt. Praktische Beispiele für das Entprellen:
Automatisches Speichern oder Überprüfen des Inhalts eines Textfelds, wenn der Benutzer "aufgehört hat zu tippen": Der Vorgang wird nur einmal ausgeführt, nachdem festgestellt wurde, dass der Benutzer nicht mehr tippt (keine Tasten mehr drückt).
Protokollierung, bei der Benutzer ihre Maus ausruhen: Der Benutzer bewegt seine Maus nicht mehr, sodass die (letzte) Position protokolliert werden kann.
Durch die Drosselung wird einfach verhindert, dass eine Funktion ausgeführt wird, wenn sie kürzlich ausgeführt wurde, unabhängig von der Anruffrequenz. Praktische Beispiele für Drosselung:
quelle
Eine echte Analogie, die mir persönlich hilft, mich zu erinnern:
Anwendungsfälle für das Entprellen :
Anwendungsfälle für Gas :
quelle
throtle ist nur ein Wrapper um das Debounce, bei dem das Debounce für einen Anruf
function
in einem bestimmten Zeitraum übergeben wird, wenn das Debounce einen Funktionsaufruf auf einen Zeitraum verzögert, der größer ist als in throtle angegeben .quelle
Die lodash Library schlägt den folgenden Artikel vor: https://css-tricks.com/debouncing-throttling-explained-examples/, in dem der Unterschied zwischen
Debounce
undThrottle
und ihrer Entstehung ausführlich erläutert wirdquelle
Drosselung
Entprellen
Möglicherweise wird eine Funktion in einem schnellen Burst 1.000 Mal aufgerufen, über 3 Sekunden verteilt und dann nicht mehr aufgerufen. Wenn Sie es nach 100 Millisekunden entprellt haben, wird die Funktion nur einmal nach 3,1 Sekunden ausgelöst, sobald der Burst beendet ist. Jedes Mal, wenn die Funktion während des Bursts aufgerufen wird, wird der Entprellungszeitgeber zurückgesetzt
Quelle: - Gas und Entprellen
quelle
Angenommen, wir haben eine Rückruffunktion "cb", die bei Ereignis "E" aufgerufen werden soll. Lassen Sie "E" 1000 Mal in 1 Sekunde ausgelöst werden, daher würde es 1000 Aufrufe von "cb" geben. Das ist 1 Anruf / ms. Zur Optimierung können wir entweder verwenden:
quelle
Soweit ich weiß, in einfachen Worten Throttling - ähnlich wie das Aufrufen von setInterval (Rückruf) für eine bestimmte Anzahl von Malen, dh das Aufrufen derselben Funktion für eine bestimmte Anzahl von Malen im Laufe der Zeit beim Auftreten eines Ereignisses und .. Debouncing - ähnlich wie das Aufrufen von setTImeout (callbackForApi) oder Aufrufen einer Funktion nach Ablauf einer bestimmten Zeit beim Auftreten eines Ereignisses. Dieser Link kann hilfreich sein - https://css-tricks.com/the-difference-between-throttling-and-debouncing/
quelle