웹 작업자에서 실행될 때 스크립트의 성능을 향상 시키려고합니다. 그것은 크래시없이 브라우저에서 큰 텍스트 파일을 구문 분석하도록 설계되었습니다. 모든 것이 잘 작동하지만 웹 작업자를 사용할 때 대용량 파일의 성능에 심각한 차이가 있음을 알 수 있습니다.웹 작업자의 성능이 30 초 후에 급격히 떨어지는 이유는 무엇입니까?
그래서 나는 간단한 실험을 수행했습니다. 스크립트를 동일한 입력으로 두 번 실행했습니다. 첫 번째 실행은 페이지의 기본 스레드에서 스크립트를 실행했습니다 (웹 작업자 없음). 당연히이 때문에 페이지가 정지되어 응답하지 않게됩니다. 두 번째 실행을 위해 웹 작업자에서 스크립트를 실행했습니다. 이 실험 (< 100 ~ MB) 작은 파일의 경우
- 는 성능 차이는 무시할 수있다. 그러나, 큰 파일에서 구문 분석 작업자 스레드에서 더 이상 약 20 배를 취합니다
파란색 라인이 예상된다. 그것은 단지 파일을 구문 분석하는 데 약 11 초가 걸릴해야하며, 성능은 상당히 안정 :
빨간색 선은 웹 노동자 내부의 성능이다. 그것은 훨씬 더 놀라운 일이다 :
처음 30 초 동안 지그재그 선 (재규어가 구문 분석 파일의 모든 체크 한 후 메인 스레드로 결과를 전송에서 약간의 지연에 의해 발생 정상). 그러나 구문 분석은 30 초에 갑자기 느려집니다. (한 번에 하나의 웹 작업자 만 사용하고 한 번에 두 개 이상의 작업자 스레드를 사용하지 않습니다.)
지연이 이 아니며 메인으로 결과를 전송하는 데이 아닌 것으로 확인되었습니다. 스레드
postMessage()
. 감속은 파서의 the tight loop에 있으며, 이는 전적으로 동기식입니다. 설명 할 수없는 이유 때문에 루프가 크게 느려지고 30 초가 지나면 느려집니다.하지만 이는 웹 작업자에게만 발생합니다. 위에서 보았 듯이 메인 스레드에서 같은 코드를 실행하면 매우 부드럽고 빠르게 실행됩니다.
왜 이런 일이 발생합니까? 성능 향상을 위해 무엇을 할 수 있습니까? (필자는 누구나 파일의 모든 1,200 + 라인을 완전히 이해할 것으로 기대하지는 않는다. 만약 그렇게했다면, 그것은 훌륭하지만, 코드에서보다 웹 작업자와 더 관련이 있다는 느낌을 받는다. 스레드).
시스템 : 16GB 메모리가 장착 된 Mac OS 10.9.4에서 Chrome 35를 실행 중입니다. 쿼드 코어 2.7GHz 인텔 코어 i7 (256KB L2 캐시 (코어 당) 및 L3 캐시 6MB) 파일 청크의 크기는 약 10MB입니다.
업데이트 : 그냥 파이어 폭스 (30)에 그것을 시도하고 하지 경험 작업자 스레드에서 동일한 둔화했다 (하지만 메인 스레드에서 실행할 때 크롬보다 느렸다). 그러나 더 큰 파일 (약 1GB)로 동일한 실험을 시도하면 약 35-40 초 후에 상당한 속도 저하가 나타납니다 (보이는 것처럼 보입니다).
간단한 i = i + 1 루프로 동일한 작업을보고 백만 회 반복마다 메시지를 인쇄합니다. 속도 저하는 Chrome에서 약 20 초 후, Firefox에서 12 초 후에 시작됩니다. 이게 뭐야? –