簡體   English   中英

優化C ++代碼

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM