AJAX 콜을 처리하는 웹 워커 - 최적화 오버킬?
웹 워커(사용 가능한 경우)를 사용하여 모든 AJAX 요청을 처리하는 코드를 사용하고 있습니다.은 거의 일밖에 않는다.XMLHttpRequest비동기(비동기)입니다.request.open("get",url,true)를 참조해 주세요.
최근 이 코드에 관한 몇 가지 문제가 생겼는데, 이 문제를 수정하는 데 시간을 들여야 할지 아니면 솔루션 전체를 폐기해야 할지 고민하기 시작했습니다.
지금까지의 조사에 의하면, 이 코드가 실제로 퍼포먼스를 해치고 있을 가능성이 있습니다.하지만 이를 뒷받침할 만한 믿을 만한 소식통을 찾을 수 없었습니다.제가 발견한 것은 두 가지뿐입니다.
- AJAX 콜에 웹 워커를 사용하기 위한 2년 된 jQuery 기능 제안
- 이 SO 질문은 약간 다른 것에 대해 질문하는 것 같습니다(Web worker와 AJAX 콜의 동기 요구를 사용).
누가 이 문제에 대해 의논하고 있는 믿을 만한 소식통을 가르쳐 주시겠습니까?아니면, 나의 의구심을 해소할 수 있는 벤치마크가 있을까요?
[EDIT] WebWorker가 결과 해석도 담당하면 이 질문은 조금 더 흥미로워집니다(JSON.parse은 퍼포먼스를 시키고 있습니까?) 비동기 해석은 퍼포먼스를 향상시키고 있습니까?
나는 jsperf에 대한 적절한 벤치마크를 작성했다.브라우저에 따라서는 WebWorker 어프로치는 원시 Ajax 콜보다 85~95% 느립니다.
주의:
- 수
new XMLHttpRequest()★★★★★★★★★★★★★★★★★」JSON.parse(jsonString);실제 AJAX 콜은 발신되지 않았습니다. - WebWorker 셋업 및 해체 작업이 측정되지 않음
- 하나의 요청을 테스트하고 있기 때문에 웹워커 접근법의 결과는 여러 요청을 동시에 실행하는 것이 더 나을 수 있습니다.
- Calvin Metcalf는 jsperf에서 동기화와 비동기화를 비교해도 정확한 결과를 얻을 수 없으며 비동기 오버헤드를 제거하는 또 다른 벤치마크를 개발했다고 설명했습니다.결과는 여전히 WebWorker 접근 방식이 상당히 느리다는 것을 보여줍니다.
- Reddit 토론에서 메인 페이지와 WebWorker 사이에 전달된 데이터는 복사되어 그 과정에서 시리얼화되어야 한다는 것을 배웠습니다.따라서 해석에만 WebWorker를 사용하는 것은 의미가 없습니다.메인 페이지에서 사용하기 전에 데이터를 시리얼화 및 역직렬화해야 합니다.
첫 번째로 기억해야 할 것은 웹 워커는 시간이 적게 걸린다는 의미에서 작업을 더 빠르게 하는 경우가 거의 없다는 것입니다.또한 백그라운드 스레드에 부하 계산을 오프로드하여 사용자 상호 작용과 관련된 처리가 차단되지 않도록 하기 위해 작업을 더 빠르게 만듭니다.예를 들어 데이터 전송을 고려할 때 대규모 계산을 수행하는 데 4초가 아닌 8초가 걸릴 수 있습니다.그러나 메인 스레드에서 이 작업을 수행할 경우 전체 페이지가 4초간 정지되며, 이는 허용할 수 없습니다.
이를 염두에 두고 메인 스레드에서 Ajax 콜을 이동시키는 것만으로는 Ajax 콜이 차단되지 않기 때문에 아무것도 얻을 수 없습니다.그러나 JSON을 해석하거나 그 이상을 해석해야 하는 경우에는 큰 요청에서 작은 서브셋을 추출하면 웹 워커가 도와줄 수 있습니다.
주의할 점은 작업자가 메인 페이지와 다른 캐시를 사용하기 때문에 동일한 리소스가 메인 스레드와 작업자에 로드되면 작업이 중복될 수 있다는 것입니다.
잘못된 위치에서 코드를 최적화하고 있습니다.
AJAX 요구는 이미 다른 스레드 내에서 실행되어 완료(및 정의된 콜백함수 호출)되면 메인 이벤트루프로 돌아갑니다
웹 워커는 스레드에 대한 인터페이스로 계산 비용이 많이 드는 작업에 사용됩니다.오랜 시간이 걸리는 계산으로 인터페이스를 차단하고 싶지 않은 기존 데스크톱 애플리케이션과 마찬가지로.
비동기 IO는 Javascript의 중요한 개념입니다.
첫째, 당신의 요청은 이미 비동기화 되어 있고 IO는 논블로킹되어 있으며 요청 중에 다른 Javascript 코드를 실행할 수 있습니다.워커에서 콜백을 실행하는 것은 요구보다 훨씬 중요합니다.
둘째, Javascript 엔진은 동일한 스레드 내의 모든 코드를 실행하므로 새로운 스레드를 생성할 경우 worker message api로 데이터 통신을 처리해야 합니다(Semaphore 참조).
결론적으로 JavaScript의 비동기 및 싱글 스레드 특성은 강력하며, 예를 들어 긴 Javascript 프로세스에서 필요한 경우에만 최대한 사용하고 워커를 만듭니다.
제 경험상 웹 워커는 AJAX 콜에 사용해서는 안 됩니다.우선, 그것들은 비동기적입니다.즉, 정보가 돌아오기를 기다리는 동안에도 코드는 계속 실행됩니다.
워커를 사용하여 응답을 처리하는 것은 웹 워커를 사용할 수 있습니다.몇 가지 예:
- 응답을 구문 분석하여 대형 모델 구축
- 응답으로부터 대량의 데이터 계산
- 템플릿 엔진과 함께 Shared Web Worker를 사용하여 AJAX 응답과 함께 HTML을 구축합니다.HTML은 DOM에 추가하기 위해 반환됩니다.
편집: 또 다른 유용한 내용은 웹 워커의 동기 요청에 대한 의견입니다.
언급URL : https://stackoverflow.com/questions/18768452/web-workers-handling-ajax-calls-optimisation-overkill
'programing' 카테고리의 다른 글
| Wordpress 플러그인 PHP 파일에서 POT 파일을 자동 생성하는 방법은 무엇입니까? (0) | 2023.02.22 |
|---|---|
| 모멘트를 사용하여 날짜 목록에서 최소 날짜 또는 최대 날짜를 얻는 방법? (0) | 2023.02.22 |
| Django Rest Framework를 사용하여 파일을 업로드하고 JSON payload를 전송하려면 어떻게 해야 합니까? (0) | 2023.02.22 |
| 각도 JS각도 JS동봉하지 않은 검증동봉하지 않은 검증 (0) | 2023.02.22 |
| AngularJS : $scope를 호출할 때 이미 진행 중인 오류 $digest를 방지합니다.$syslog() (0) | 2023.02.22 |