2014-09-11 4 views
3

요즘 일부 node.js 네이티브 기능을 벤치마킹하려고했는데 이해할 수없는 오싹한 결과를 발견했습니다.Node.js 스트림 루프에서 쓰기

http://pastebin.com/0eeBGSV9

당신은 그것을 200 동시성 100,000 요청에 초당 건강한 8,553 요청을 한 것을 볼 수 있습니다 여기에 내가 벤치마킹 간단한 코드 및 벤치 마크 결과입니다. 친구의 지시에 따라,이 루프는 노드의 이벤트 루프를 방해 할 정도로 크지 않기 때문에이 경우 비동기를 사용하지 말아야하므로 루프에 사용할 코드를 리팩토링하고 벤치 마크 결과를 더 높게 만들었습니다. 이상 :

http://pastebin.com/0jgRPNEC

는 여기에서 우리는 초당 9174 개 요청을해야합니다. 산뜻한. (for 루프 버전은 반복 횟수를 10k로 변경해도 비동기 버전보다 일관되게 빠르다.

그러나 루프가 끝난 후 모든 데이터를 덤프하는 대신 스트리밍을 사용하여이 결과를 더 밀어 낼 수 있다면 내 친구가 방황했습니다.

http://pastebin.com/wM0x5nh9

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에서 소비하기 위해 만든 새로운 스트림으로 데이터를 푸쉬 한 방법을 변경했습니다. 순진하게도, 이런 방식으로 노드가 어떻게 든 출력 버퍼링과 스트림 데이터를 효과적인 방법으로 최적화 할 수 있다고 믿었습니다. 이 솔루션은 너무 일을하지만, 이전보다 더 느렸다 :

http://pastebin.com/erF6YKS5

+1

비동기 사용시 비동기 코드가 자동으로 작성되지는 않습니다. 첫 번째 벤치 마크는 단순한 for-loop보다 느 렸습니다. 왜냐하면 기본적으로 비동기 라이브러리의 오버 헤드가 추가 된 단순한 for-loop 였기 때문입니다. – nickclaw

+0

그래, 나는 벤치 마크 이후에 그것을 깨달았다. 하지만 스트리밍이 왜 짜증나는지는 대답하지 못합니다.드레인 이벤트를 통한 배압 감지로 테스트 한 결과 여전히 2900 rps 정도입니다. – Egregore

답변

1

내 생각 엔 많은 별도의 write() 콜을 갖는 관련된 오버 헤드가 될 것입니다. 그래서 당신은 당신이 원하는만큼 res.write()을 할 수있는 기능 has been added "를 병마개"노드 v0.12 +에서

,하지만 당신은 코르크 할 수있는 그 쓰기의 모든 단일 write() 콜 될 수 있도록 스트림을 토로하다. 이것은 본질적으로 출력 연결을 통해 현재 수행중인 작업입니다. 단, 코킹 작업이 출력 작업을 대신 수행합니다. 노드 코어의 일부 장소에서는이 코킹 기능이 자동으로 뒷 배경에 사용되므로 성능을 향상시키기 위해 명시 적으로 코르크/코 드를 사용할 필요가 없습니다.

+0

스트리밍을 사용하려는 이유가 있습니다. 스트리밍 중입니다. 하나의 write() 시스템 콜이 필요 없으며, 스트리밍이 아니라 전체 출력을 한 조각으로 보내고 있습니다. 나는 그것이 하나의 변수에 모든 것을 연결하고 단지 res.end()를 사용하고 클라이언트에 푸시 할 수 있기 때문에 for 루프에서 얻은 결과를 노드로 보내고 싶다. – Egregore