내 응용 프로그램 (네트워크 도구) 용 클래스를 설계하고 있습니다. 이 기본 클래스 :C++ 코드 최적화
class Descriptor
{
// ...
public:
virtual void data_read (void);
virtual void data_write (void);
virtual void data_error (void);
protected:
int socket_descriptor;
// ...
}
class TcpClient :
public Descriptor
{
// ...
}
많은 클래스는 설명자를 기반으로합니다. epoll을 사용하여 소켓 이벤트를 모니터링합니다. 내가하여 TcpClient 객체에 이벤트를보고 싶을 때 나는 epoll 파일, 코드에이 객체에 객체의 소켓과 포인터를 추가
이epoll_event descriptor_events;
descriptor_events.events = EPOLLIN;
descriptor_events.data.fd = this->socket_descriptor;
descriptor_events.data.ptr = this;
epoll_ctl (epoll_descriptor, EPOLL_CTL_ADD, this->socket_descriptor, &descriptor_events);
내가 이런 식으로 별도의 스레드에서의 epoll 이벤트를 파견 :
Descriptor *descriptor (NULL);
// ...
return_value = epoll_wait (epoll_descriptor, events, 64, -1);
while (i < return_value)
{
descriptor = (Descriptor *) (events [i]).data.ptr;
if ((events [i]).events & EPOLLOUT)
descriptor->data_write();
if ((events [i]).events & EPOLLIN)
descriptor->data_read();
if ((events [i]).events & EPOLLERR)
descriptor->data_error();
i++;
}
프로그램은 epoll 스레드에서 많은 양의 데이터를 처리 할 것이므로 가상 함수가 여러 번 호출 될 것입니다. 이 솔루션의 런타임 비용에 대해 궁금합니다.
typedef void (*function) (Descriptor *) EventFunction;
class Descriptor
{
// ...
public:
EventFunction data_read;
EventFunction data_write;
EventFunction data_error;
protected:
Descriptor (EventFunction data_read,
EventFunction data_write,
EventFunction data_error);
int socket_descriptor;
// ...
}
또는 CRTP를 사용
나는 또한 두 개의 다른 구현에 대해 생각하고는 (그러나 나는 간호원 경우 훨씬 더 빨리 확실하지 않다).
어쩌면 이것을 구현하는 다른 아이디어가 있을까요?
CRTP는 어떻습니까? 약간 못 생겼지 만 런타임 오버 헤드를 제공하지 않아야합니다. – Goofy
CRTP가 옵션 인 경우 언제든지 가십시오. 그러나 저수준 소켓 I/O의 경우 CPU가 병목 현상이되지 않는 경우가 많습니다. 대부분의 경우에는 아무런 차이가 없습니다. 왜냐하면 초당 많은 패킷을 송수신하지 않기 때문입니다. – jalf
+1 to jalf. 효율적인 저수준 소켓 I/O는 일반적으로 스레드를 매우 강력하고 효율적으로 사용합니다. 일부 운영 체제의 경우 가장 확장 성이 뛰어난 서버를 작성하려면 커널 수준의 프로그래밍이 필요합니다! Windows에는 I/O 완료 포트가 있습니다. – stinky472