> 웹 프론트엔드 > JS 튜토리얼 > 단순화된 고성능 JavaScript: Web Workers, SharedArrayBuffer 및 Atomics

단순화된 고성능 JavaScript: Web Workers, SharedArrayBuffer 및 Atomics

DDD
풀어 주다: 2024-12-21 16:00:15
원래의
733명이 탐색했습니다.

High-Performance JavaScript Simplified: Web Workers, SharedArrayBuffer, and Atomics

JavaScript는 단일 스레드 언어입니다. 즉, 작업은 메인 스레드에서 한 번에 하나씩 실행됩니다. 이 디자인은 개발을 단순화하지만 계산량이 많은 작업에서는 성능 병목 현상이 발생할 수 있습니다. 이 블로그에서는 Web Workers, SharedArrayBuffer 및 Atomics가 JavaScript의 멀티스레딩을 활성화하여 고성능 애플리케이션을 구축하는 방법을 살펴봅니다.

Web Worker, SharedArrayBuffer 및 Atomics를 사용하는 이유는 무엇입니까?

웹 작업자

웹 작업자는 백그라운드 스레드에서 JavaScript를 실행하여 스크롤이나 버튼 클릭과 같은 집중적인 작업으로 인해 사용자 상호 작용이 차단되는 것을 방지합니다.

공유 배열 버퍼

SharedArrayBuffer를 사용하면 복사하지 않고도 메인 스레드와 작업자 간에 메모리를 공유할 수 있으므로 더 빠른 통신이 가능합니다.

원자학

Atom은 공유 메모리에 대한 안전하고 동기화된 액세스를 보장하여 경합 상태를 방지하고 스레드 전체에서 데이터 일관성을 유지합니다.

예: Web Workers 및 SharedArrayBuffer를 사용한 실제 작업

대규모 배열의 합을 병렬로 계산하는 간단하고 실제적인 예를 구현해 보겠습니다.

1단계: 웹 작업자 스크립트 생성

부분 합계 계산을 처리하기 위해 Worker.js라는 파일을 만듭니다.

// worker.js
self.onmessage = function (event) {
    const { array, start, end } = event.data;
    let sum = 0;
    for (let i = start; i < end; i++) {
        sum += array[i];
    }
    self.postMessage(sum);
};
로그인 후 복사

2단계: 메인 스레드 설정

메인 스크립트에서는 작업자 간에 작업을 나누어 수행합니다.

// main.js
const array = Array.from({ length: 1_000_000 }, () => Math.floor(Math.random() * 100));
const numWorkers = 4;
const chunkSize = Math.ceil(array.length / numWorkers);
const workers = [];
const results = [];
let completedWorkers = 0;

// Create a SharedArrayBuffer for the array
const sharedBuffer = new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT * array.length);
const sharedArray = new Int32Array(sharedBuffer);
sharedArray.set(array);

// Initialize workers
for (let i = 0; i < numWorkers; i++) {
    const worker = new Worker('worker.js');
    workers.push(worker);

    const start = i * chunkSize;
    const end = Math.min(start + chunkSize, array.length);

    worker.postMessage({ array: sharedArray, start, end });

    worker.onmessage = function (event) {
        results[i] = event.data;
        completedWorkers++;

        if (completedWorkers === numWorkers) {
            const totalSum = results.reduce((acc, curr) => acc + curr, 0);
            console.log('Total Sum:', totalSum);
        }
    };
}

로그인 후 복사

3단계: 동기화를 위해 Atomics 사용

Atomics를 사용하여 진행을 관리하거나 진행하기 전에 모든 스레드가 완료되었는지 확인하세요.

const progress = new Int32Array(sharedBuffer);
Atomics.add(progress, 0, 1); // Increment progress

if (Atomics.load(progress, 0) === numWorkers) {
    console.log('All workers completed their tasks.');
}
로그인 후 복사

이 접근 방식의 이점

  • 원활한 사용자 경험: 메인 스레드에서 계산 부담을 덜어줍니다.

  • 빠른 통신: SharedArrayBuffer는 스레드 간 데이터 복사를 방지합니다.

  • 스레드 안전성: Atomics는 동기화를 효과적으로 처리하는 도구를 제공합니다.

실제 사용 사례

  • 실시간 분석: 더 빠른 통찰력을 위해 대규모 데이터 세트를 병렬로 처리합니다.

  • 게임 엔진: 별도의 스레드에서 물리 시뮬레이션을 수행합니다.

  • 미디어 처리: UI 지연 없이 비디오 스트림을 인코딩 또는 디코딩합니다.

참고자료

MDN 웹 문서: 웹 워커

MDN 웹 문서: SharedArrayBuffer

MDN 웹 문서: Atomics

위 내용은 단순화된 고성능 JavaScript: Web Workers, SharedArrayBuffer 및 Atomics의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿