>웹 프론트엔드 >JS 튜토리얼 >JavaScript의 디바운싱과 조절: 더 나은 성능을 위한 함수 호출 최적화

JavaScript의 디바운싱과 조절: 더 나은 성능을 위한 함수 호출 최적화

Patricia Arquette
Patricia Arquette원래의
2024-12-22 19:38:13302검색

Debouncing vs Throttling in JavaScript: Optimizing Function Calls for Better Performance

JavaScript의 디바운싱 및 제한 이해

디바운싱과 제한은 함수 실행 속도를 제어하기 위해 JavaScript에서 사용되는 두 가지 중요한 기술입니다. 이러한 기술은 특히 사용자 입력 처리, 이벤트 스크롤 및 이벤트 크기 조정과 같은 시나리오에서 성능을 최적화하는 데 자주 사용됩니다. 둘 다 함수 호출 빈도를 제한하는 데 사용되지만 작동 방식은 다릅니다.

1. 디바운싱

디바운싱은 마지막 이벤트 이후 일정 시간이 지난 후에만 함수가 호출되도록 보장합니다. 즉, 사용자가 텍스트 필드에 입력하거나 창 크기를 조정하는 등의 작업 수행을 완료할 때까지 기능 실행을 지연합니다. 이는 사용자가 검색창에 입력할 때와 같이 함수가 너무 자주 호출되는 것을 방지하려는 시나리오에 특히 유용합니다.

디바운싱 작동 방식:

  • 이벤트가 발생하면 일정 시간 동안 함수 호출이 지연됩니다.
  • 지연 시간이 경과하기 전에 다시 이벤트가 발생하면 이전 함수 호출이 취소되고 지연 타이머가 재설정됩니다.
  • 이 기능은 추가 이벤트 없이 지연 시간이 경과한 후에만 실행됩니다.

디바운싱의 예:

function searchQuery(query) {
  console.log(`Searching for: ${query}`);
}

function debounce(func, delay) {
  let timeout;
  return function (...args) {
    clearTimeout(timeout);
    timeout = setTimeout(() => {
      func.apply(this, args);
    }, delay);
  };
}

const debouncedSearch = debounce(searchQuery, 500);

// Simulating typing events
debouncedSearch("JavaScript");
debouncedSearch("JavaScript debouncing");
debouncedSearch("Debouncing function"); // Only this will be logged after 500ms

이 예에서는:

  • debouncedSearch는 다른 호출 없이 500밀리초가 경과한 후에만 searchQuery를 호출합니다.
  • 이렇게 하면 문자를 입력할 때마다 검색 기능이 호출되는 것을 방지할 수 있습니다.

디바운싱 사용 사례:

  • 검색입력 : 실시간 추천검색어 구현 시.
  • 창 크기 조정: 크기 조정 이벤트가 발생할 때마다 레이아웃 재계산이 발생하지 않도록 합니다.
  • 스크롤 이벤트: 특히 무한 스크롤 시나리오에서 연속 스크롤 중에 함수가 실행되는 것을 방지합니다.

2. 제한

조절은 이벤트가 몇 번이나 트리거되었는지에 관계없이 지정된 간격마다 최대 한 번 함수가 호출되도록 합니다. 이는 사용자가 특정 기간 내에 창을 스크롤하거나 크기를 조정할 수 있는 횟수를 제한하는 등 함수 호출 빈도를 제한하려는 경우에 유용합니다.

제한 작동 방식:

  • 처음 이벤트가 발생하면 즉시 함수가 실행됩니다.
  • 그 이후에는 이벤트가 더 자주 트리거되더라도 최대 n밀리초마다 한 번씩 실행됩니다.

조절의 예:

function searchQuery(query) {
  console.log(`Searching for: ${query}`);
}

function debounce(func, delay) {
  let timeout;
  return function (...args) {
    clearTimeout(timeout);
    timeout = setTimeout(() => {
      func.apply(this, args);
    }, delay);
  };
}

const debouncedSearch = debounce(searchQuery, 500);

// Simulating typing events
debouncedSearch("JavaScript");
debouncedSearch("JavaScript debouncing");
debouncedSearch("Debouncing function"); // Only this will be logged after 500ms

이 예에서는:

  • throttledScroll은 해당 시간 동안 얼마나 많은 스크롤 이벤트가 발생하더라도 logScrollEvent가 초당 최대 한 번 호출되도록 보장합니다.
  • 처음에는 함수가 즉시 실행되고 이후 호출은 간격을 유지하기 위해 지연됩니다.

제한 사용 사례:

  • 스크롤 이벤트: 스크롤하는 동안 함수가 호출되는 빈도를 제한합니다(예: 이미지 지연 로딩).
  • 크기 조정 이벤트: 창 크기 조정 기능이 호출되는 횟수를 최적화합니다.
  • 마우스 움직임: 빠른 마우스 움직임 중에 연속 실행을 방지합니다.

3. 디바운싱과 제한: 주요 차이점

기능
Feature Debouncing Throttling
Function Execution Executes after a delay when events stop Executes at a fixed interval, no matter how many events occur
Use Case Ideal for events that occur frequently but should trigger once after some idle time (e.g., input fields, search bars) Ideal for events that fire continuously (e.g., scroll, resize) but should be limited to a fixed interval
Example Scenario Search bar input where suggestions are updated only after the user stops typing for a certain period Scroll events where a function should only run once every few seconds, even if the user scrolls frequently
Execution Frequency Executes only once after the event stops firing Executes periodically, based on the interval set
Effectiveness Prevents unnecessary executions during rapid event firing Controls the frequency of function executions, even during continuous events
디바운싱 제한 함수 실행 이벤트가 중지되면 지연 후 실행 이벤트가 아무리 많이 발생하더라도 고정된 간격으로 실행 사용 사례 자주 발생하지만 유휴 시간이 지나면 한 번만 실행되어야 하는 이벤트에 이상적입니다(예: 입력 필드, 검색 창) 지속적으로 실행되는 이벤트(예: 스크롤, 크기 조정)에 적합하지만 고정된 간격으로 제한되어야 합니다. 예시 시나리오 사용자가 특정 기간 동안 입력을 중단한 후에만 제안이 업데이트되는 검색창 입력 사용자가 자주 스크롤하더라도 함수가 몇 초마다 한 번씩만 실행되어야 하는 스크롤 이벤트 실행 빈도 이벤트 실행이 중지된 후 한 번만 실행 설정된 간격에 따라 주기적으로 실행 효과 신속한 이벤트 발생 중 불필요한 실행 방지 연속 이벤트 중에도 함수 실행 빈도를 제어합니다.

4. 실제 예: 디바운싱과 스로틀링을 함께 사용

애플리케이션을 최적화하기 위해 두 기술이 모두 필요한 상황에서는 디바운싱과 제한을 결합할 수 있습니다. 예를 들어 검색어를 디바운싱하는 동시에 스크롤 이벤트를 제한할 수 있습니다.

function searchQuery(query) {
  console.log(`Searching for: ${query}`);
}

function debounce(func, delay) {
  let timeout;
  return function (...args) {
    clearTimeout(timeout);
    timeout = setTimeout(() => {
      func.apply(this, args);
    }, delay);
  };
}

const debouncedSearch = debounce(searchQuery, 500);

// Simulating typing events
debouncedSearch("JavaScript");
debouncedSearch("JavaScript debouncing");
debouncedSearch("Debouncing function"); // Only this will be logged after 500ms

이 예에서는:

  • 스크롤 이벤트는 1초에 한 번만 트리거되도록 제한됩니다.
  • 검색 입력은 500ms 동안 활동이 없을 때만 트리거되도록 디바운싱됩니다.

결론

  • 디바운싱은 이벤트가 트리거되지 않고 일정 시간이 지난 후 함수가 실행되도록 보장하므로 검색 입력이나 크기 조정과 같은 시나리오에 이상적입니다.
  • 조절은 주어진 시간 내에 함수가 실행될 수 있는 횟수를 제한하므로 스크롤이나 창 크기 조정과 같은 이벤트에 유용합니다.

두 기술 모두 성능을 최적화하고 특히 이벤트가 빠르게 발생하는 경우 불필요한 실행을 방지하는 데 도움이 됩니다.


안녕하세요. 저는 Abhay Singh Kathayat입니다!
저는 프론트엔드와 백엔드 기술 모두에 대한 전문 지식을 갖춘 풀스택 개발자입니다. 저는 효율적이고 확장 가능하며 사용자 친화적인 애플리케이션을 구축하기 위해 다양한 프로그래밍 언어와 프레임워크를 사용하여 작업합니다.
제 비즈니스 이메일(kaashshorts28@gmail.com)로 언제든지 연락주세요.

위 내용은 JavaScript의 디바운싱과 조절: 더 나은 성능을 위한 함수 호출 최적화의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.