2013-06-30 2 views
1

나는 논리적 일 수 있다고 생각되는 몇 가지 질문을하고 싶지만, 인터넷에서 확실한 증거를 찾을 수는 없다.소켓 속도 이론 읽기

이 프로토콜에 대한 메시지를 구문 분석하는 방법의 기초. \n이 충족 될 때까지 소켓 버퍼를 읽고 메시지 핸들러에 메시지를 디스패치하십시오.

이제 염두에두면 더욱 효율적입니다.

Method A) 
1) read 1 byte from from socket buffer 
2) check to see if byte is a newline 
3) if it is not append to the array if it is send array to message handler and clear array 
4) repeat until connection closed 

또는

Method B) 
1) read multi bytes from socket buffer as one chunk 
2) search the array for a newline 
3) if newline is found, send the beginning of the array up to the newline to message handler, then remove it from the array shifting remaining data down. 
4) repeat until connection closed 

언어이에 역할을하는 경우

은, 그것은 검색 및 자사 문자열 함수를 사용하여 루비에서 수행 될 것이다.

나는 그것이 더 많은 데이터를 읽기 때문에 방법 B가 더 빠를 것이라고 생각,하지만 다시 문자열 검색이 빠를 것입니다 방법 A.

이상 추가 단계를 제공합니다?

+0

OS는 대부분의 들어오는 데이터를 내부적으로 버퍼링합니다. 따라서 A와 B 모두이 버퍼에서 읽을 것입니다. 기본적으로 전체 버퍼를 읽는 것보다 빠르게 한 번에 1 바이트 씩 버퍼를 읽는 것이 문제입니다. Neil은 아래에서 나머지 부분을 설명합니다. 나는 당신이 운영체제 (호출 당 더 적은 레이어, 적은 메모리 관리 오버 헤드 등)에 덜 인터페이스 할 것이므로 B가 더 빠를 것이라고 확신한다. – Casper

답변

1

Ruby 메서드 B 이 빠르지 만 소켓 처리에 대한 일반적인 설명이 아닌 언어 문제입니다. 두 경우 모두 소켓 버퍼와이를 처리하는 저수준 루틴이 다른 계층의 I/O 성능을 응용 프로그램에 제공합니다.

응용 프로그램이 소켓의 데이터를 따라 잡으면 I/O 바인딩 일 수 있으며 접근 방식간에 차이가 없음을 알 수 있습니다.

그러나 Ruby에서는 개별적인 숫자/바이트/문자가 많은 수의 Ruby 객체를 생성하고 각각의 오버 헤드가 적기 때문에 코드 항목이 효율적이지 않습니다. 이렇게하면 순수 Ruby는 문자를 파싱 할 때 상대적으로 느려지므로 응용 프로그램의 성능을 향상 시키려면 문자열에 대량 메서드를 사용해야합니다. 문자별로 문자 처리가보다 최적화 된 내부 메서드에서 수행됩니다.

완료 시간에 영향을 주는지 여부는 소켓에 입력 된 데이터의 속도에 따라 다릅니다. 사용자 CPU 시간을 고려하지 않으면 차이를 측정하지 못할 수도 있습니다. 단일 코어 프로세서와 같이 CPU 시간에 대한 경합이있는보다 복잡한 시나리오를 건너 뛰고 있다고 덧붙여 야합니다.