2011-05-10 3 views
0

모두 안녕하세요. 이곳은 지식의 금광과 같아서 나를 너무 많이 돕고 있습니다! 다음 질문은 :소켓 서버에서 보내고받은 데이터 처리 중 #

내 C# 소켓 서버로 전송되는 바이트 데이터가 있습니다. 나는 ascii 문자열로 변환 한 다음, 일반적인 문자 (예 : bar | 문자)를 기반으로 데이터를 분할하고 데이터를 사용합니다. 일반적으로 첫 번째 데이터는 4 자리 숫자로 된 명령입니다. 나는 이것이 매우 효율적이지 않다고 상상할 수있다! 데이터를 처리하는 가장 좋은 방법은 수신, 효율적입니까?

관련하여 어떻게 트래핑 및 처리 명령을 수행합니까? 여러 개의 if 문 또는 큰 case/switch 문. 속도와 효율성이 정말로 필요합니다.

+2

현재 방법을 보여주고 비효율적임을 증명하고 다시 돌아옵니다. 문자열 분할이 비효율적이라고 생각한다면 마이크로 최적화가 거의 보장 될 수 있습니다. –

답변

1

일반적으로 첫 번째 데이터는 4 자리 숫자로 된 명령입니다. 나는 이것이 매우 효율적이지 않다고 상상할 수있다! 데이터를 처리하는 가장 좋은 방법은 수신, 효율적입니까?

아니요, 숫자를 문자열로 /에서 변환하는 것이 효율적이지 않습니다. 그러나 질문은 : 그것은 정말로 중요합니까? 너무 조기에 최적화하려고하는 것처럼 들립니다. 그거 하지마. 목표는 읽고 유지하기 쉬운 코드를 작성하는 것입니다. 누군가 성능에 대해 실제로 불평 할 때까지는 최적화를 수행하지 마십시오.

관련하여 어떻게 트래핑 및 처리 명령을 수행합니까? 여러 개의 if 문 또는 큰 case/switch 문. 속도와 효율성이 정말로 필요합니다.

다시. 명령 처리가 실제로 응용 프로그램의 병 목인지 확인하십시오.

전체 처리는 수신 메시지로 수행하는 작업에 따라 다릅니다. 당신은 적절한 답을주기 위해 약간의 정보를 제공합니다. 새로운 질문을 만드십시오 (하나의 질문 두 개는 실제로 허용되지 않으므로). 현재 취급하고있는 코드를 추가하고 그것에 대해 마음에 들지 않는 것을 설명하십시오.

0

실제로에 성능이 필요하다면 명령에 문자열 표현을 사용하지 말고 직접 바이트로 작업해야합니다. 문자열 형식의 네 가지 숫자는 32 비트 중 64 비트 (사용하는 charset에 따라 다름)이며 단일 바이트는 4 자리 숫자를 저장하기에 충분합니다. 많은 브랜치를 사용하면 성능에 영향을 미친다 (if -statements).

내 제안은 메시지에 고정 된 크기의 접두사를 사용하여 명령을 예약하는 것입니다. 그런 다음이 바이트를 사용하여 실행해야하는 테이블에서 O (1)을 조회하면이 테이블은 메서드 execute을 가진 개체로 채울 수 있습니다. 그래서 뭔가를 할 수 있습니다 table[command].execute().

그렇다고해서 성능 향상이 그다지 크지 않을 것이고 직렬화 라이브러리 중 하나를 사용하면 더 나은 (유지 관리 관점) 것이라고 생각합니다.