[英]C/C++: Is there a performance penalty for using the adapter pattern?
我在C ++項目中使用C語言編寫的高性能/並行圖形庫 。 它提供了結構stinger
(圖形數據結構)和操作之類的
int stinger_insert_edge_pair (struct stinger *G,
int64_t type, int64_t from, int64_t to,
double weight, int64_t timestamp) { .... }
但是,大多數情況下,我不想指定時間戳或權重或類型。 默認參數會很好。 此外,類似OOP的界面會很好: G->insertEdge(u, v)
而不是insert_edge_pair(G, u, v, ...)
。
所以我在考慮創建一個類似的適配器類
class Graph {
protected:
stinger* stingerG;
public:
/** default parameters ***/
double defaultEdgeWeight = 1.0;
/** methods **/
Graph(stinger* stingerG);
virtual void insertEdge(node u, node v, double weight=defaultEdgeWeight);
};
insertEdge(...)
方法只需使用適當的參數調用stinger_insert_edge_pair(this->stingerG, ...)
。
但是,性能是一個至關重要的方面。 使用這樣的適配器類有什么性能損失? 與使用“裸”庫相比,我是否應該期望性能下降?
虛函數通常不能內聯,因此函數調用會產生相同的開銷(推送堆棧上的參數,可能會中斷管道和緩存等)。 實際上,例程函數調用非常快 - 按時鍾周期排序。 確定這是否合適的唯一方法是測試您自己的應用程序。
如果你使用普通的inline
方法,編譯器應該在調用點內聯它們,這樣就不會有任何性能損失。 但請注意,您不應該使用虛函數。
如果你的insertEgde只是將調用轉發給stinger_insert_edge_pair,那么(很可能)在對stinger_insert_edge_pair和g-> insertEdge的普通調用之間生成的代碼沒有區別(前提是你刪除了虛擬指定符)。 比較通過普通調用和適配器調用生成的匯編代碼可以為您的適配器帶來的開銷提供公平的輸入。
insertEdge必須是虛擬的嗎? 你打算有Graph的子類嗎? 但同樣,與功能執行本身的實際成本相比,虛函數調用的成本幾乎可以忽略不計。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.