요즘 일부 node.js 네이티브 기능을 벤치마킹하려고했는데 이해할 수없는 오싹한 결과를 발견했습니다.Node.js 스트림 루프에서 쓰기
당신은 그것을 200 동시성 100,000 요청에 초당 건강한 8,553 요청을 한 것을 볼 수 있습니다 여기에 내가 벤치마킹 간단한 코드 및 벤치 마크 결과입니다. 친구의 지시에 따라,이 루프는 노드의 이벤트 루프를 방해 할 정도로 크지 않기 때문에이 경우 비동기를 사용하지 말아야하므로 루프에 사용할 코드를 리팩토링하고 벤치 마크 결과를 더 높게 만들었습니다. 이상 :
는 여기에서 우리는 초당 9174 개 요청을해야합니다. 산뜻한. (for 루프 버전은 반복 횟수를 10k로 변경해도 비동기 버전보다 일관되게 빠르다.그러나 루프가 끝난 후 모든 데이터를 덤프하는 대신 스트리밍을 사용하여이 결과를 더 밀어 낼 수 있다면 내 친구가 방황했습니다.
aaaaand 우리는 초당 2,860 요청이 : 다시 한번 데이터 출력을 처리 할 수 res.write를 사용하는 코드를 리팩토링. 여기 무슨 일이 있었습니까? 스트림 필기가 너무 느린 이유는 무엇입니까? 내 코드에 어떤 종류의 오류가 있습니까? 아니면 노드가 실제로 스트림과 어떻게 작동합니까?
노드 버전은 우분투에서 0.10.25이며, apt 설치의 기본 설정입니다.
또한 처음에는 결과가 http://pastebin.com/6tuYGhYG 인 JXCore 및 HHVM (async.js 버전의 노드 코드 사용)에 대해 동일한 코드를 테스트했으며 노드 클러스터가 최신 jxcore 2.3.2보다 빠르다는 흥미로운 결과를 얻었습니다.
모든 비평은 크게 감사하겠습니다.
EDIT : @Mscdex, res.write()가 문제가되었을 수 있으므로 궁금 해서요. 그래서 res에서 소비하기 위해 만든 새로운 스트림으로 데이터를 푸쉬 한 방법을 변경했습니다. 순진하게도, 이런 방식으로 노드가 어떻게 든 출력 버퍼링과 스트림 데이터를 효과적인 방법으로 최적화 할 수 있다고 믿었습니다. 이 솔루션은 너무 일을하지만, 이전보다 더 느렸다 :
비동기 사용시 비동기 코드가 자동으로 작성되지는 않습니다. 첫 번째 벤치 마크는 단순한 for-loop보다 느 렸습니다. 왜냐하면 기본적으로 비동기 라이브러리의 오버 헤드가 추가 된 단순한 for-loop 였기 때문입니다. – nickclaw
그래, 나는 벤치 마크 이후에 그것을 깨달았다. 하지만 스트리밍이 왜 짜증나는지는 대답하지 못합니다.드레인 이벤트를 통한 배압 감지로 테스트 한 결과 여전히 2900 rps 정도입니다. – Egregore