2012-03-11 2 views
1

한 클래스 Receiver은 udp 데이터 그램 (1 초마다 1000 개가 넘는 데이터 그램)을 수신합니다. 이벤트 VS 그냥 메서드 호출?

내가 아마 그 때 나는 새로운 데이터 그램에 대한 알림이 클래스에 Consumers의 수를 첨부 할 수 있습니다 Receiver

public event EventHandler<NewDatagramEventArgs> NewMessage; 
protected virtual void OnNewMessage(NewDatagramEventArgs e) 
{ 
    if (NewDatagram != null) 
     NewDatagram(this, e); 
} 
.... 
socket.Receive(result) 
.... 
OnNewMessage(new NewDatagramEventArgs(result)); 
..... 

에 같은 코드를 작성해야 OOP한다.

는 실제로 나는 항상 정확히 하나 개의 소비자, 그래서 난 그냥 쓸 수 있습니다 :

socket.Receive(result); 
Consumer.Instance.NewDatagram(result); 

을 그리고 나는 꽤가 각각 별도의 밀리 초는 여분의 돈을 것입니다 소프트웨어를 거래 있기 때문에 빨리 일을해야합니다.

첫 번째 접근 방법은 얼마나 느린가요? 두 번째 방법은 얼마나 못 생겼습니까?

+1

코드를 멋지게 꾸미고 최신 디자인 패턴을 따르는 것이 좋지만 비즈니스 요구 사항은 처음부터 ** 있습니다. 속도가 필요한 경우 두 가지 방법을 모두 테스트하고 더 빠른 것을 선택하십시오. – dlev

답변

0

Delegates perform well 그래서 나는 그것에 너무 신경 쓰지 않을 것입니다. 프로필을 작성하고 상당한 차이가 있는지 확인합니다.

실제로 차이가 있다면 소비자/수신기의 더 강력한 커플 링이 유일한 옵션 일 수 있습니다 (끔찍한 옵션이 아닙니다. 논리적 페어링입니다).

참고로, 작은 중간 저장소 구조 (큐, 스택 등)를 사용하고 들어오는 데이터를 메시지별로 메시지가 아닌 간격으로 덤프하여 우수한 성능을 얻었습니다. 이것은 귀하의 신청에 대한 선택 일 수도 있고 아닐 수도 있습니다.

3

논리적으로 수신기가 하나 뿐인 경우에는 항상 대리자를 생성자 인수로 사용하여 직접적으로 단일 개체를 참조하는 대신 수신기로 사용할 수 있습니다. 그렇게하면 간단한 논리로 디커플링을 할 수 있습니다.

0

수신기가 실제로 하나 뿐인 경우 이벤트를 만들지 않습니다. 그러나 나는 Receiver에서 Consumer를 직접 사용하지 않을 것이다. 단단한 커플 링은 이유가 없을 때 피해야합니다.

위임자는 이미 제안 된 것처럼 잘 작동하지만 대신 인터페이스를 사용해 볼 수도 있습니다.

소비자가 저수준 네트워크 이벤트에 직접 응답하기 때문에 어떤 시점에서 다른 이벤트가 발생할 때 알려주고 싶을 수도 있습니다. 소켓 폐쇄. 인터페이스를 사용할 때는 새로운 메소드를 생성하고이를 소비자에게 구현하면된다. 델리게이트 만있는 경우 새 이벤트에 대해 두 번째 이벤트를 만들고 다른 이벤트에 대해서는 두 번째 이벤트를 만들거나 하나의 델리게이트가 여러 이벤트를 처리하도록해야합니다.