我正在为我的应用程序(网络工具)设计类。我这个基类:优化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线程中的大量数据,所以它意味着虚拟函数将在那里被多次调用。我想知道这个解决方案的运行时间成本。
我还想着其他两种实现方式(但我不知道如果the're更快):
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 2010-06-28 18:15:34
如果CRTP是一个选项,随时去找它。但对于低级套接字I/O,CPU通常不是瓶颈。很可能它绝对没有区别,因为你不会每秒发送/接收很多数据包。 – jalf 2010-06-28 19:27:43
+1给jalf。有效的低级套接字I/O通常归结为非常严格和高效地使用线程。对于某些操作系统,编写最具可扩展性的服务器甚至需要内核级编程!在Windows上,我们有I/O完成端口。 – stinky472 2010-06-29 08:14:21