[英]Optimizing C++ code
我正在為我的應用程序(網絡工具)設計類。 我這個基類:
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。
也許您還有其他實現此想法?
除非另外證明,否則您的原始設計對我來說還不錯。
優化的首要規則是先進行測量,然后僅修復真正存在的熱點。 您會在代碼花費時間的地方感到驚訝。 幾乎可以肯定,過早地優化虛擬函數和函數指針之間的區別。 在這兩種情況下,編譯器都將生成代碼以跳轉到函數指針,盡管使用虛函數,編譯器將必須先查找vtable。 編寫慣用的C ++代碼以執行所需的操作,然后在遇到性能問題時對其進行概要分析。
(我對您的類Descriptor
有一個評論:除非您打算使用通用的data_read(),data_write()和data_error()方法,否則建議將它們設為純虛擬方法。)
老實說,優化此代碼的最佳選擇可能是將其完全替換為Boost ASIO 。 如前所述,您實際上是在重新實現經過嚴格審查和測試的ASIO庫。 除非您絕對確定必須滾動自己的I / O庫,否則僅使用現有解決方案就可以節省大量的開發和優化時間。
在不要重新發明車輪傘的情況下,建議您看一下Boost.Asio,因為它提供了示例代碼中描述的大多數功能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.