2010-10-22 63 views
7

是否有人知道,如果boost::getboost::variant性能耗時的操作沒有。C++ - 升壓GET問題

現在我在性能關鍵部分,其中「varianting」是爲每一個可能的類型落實容器和相應的enum重構了一些舊代碼。

顯然,這是快,但醜陋而現在,當我不得不重構代碼,以便它與一個更有型工作,我想擺脫的代碼,舊的一部分,並與boost::variant更換。

此外,我不能簡單地「配置文件變種和比較」,因爲這個重構是一個痛苦的屁股,並會相當耗時。

因此,如果有人知道如何boost::get<x>執行比較泛型enum-based類型調度,我將不勝感激,如果你分享這些知識。

有使用boost::variant<types>定製訪問者(如boost::variant文檔描述)的另一種變體 - 這可能比我的情況boost::get快?

謝謝。

+0

您是否嘗試過查看源代碼? http://www.boost.org/doc/libs/1_44_0/boost/variant/get.hpp – Wernight 2010-10-22 13:18:54

+0

如果_custom_操作比他們自己的操作更快,他們是不是將自己的實現基於自定義實現? – sbi 2010-10-22 15:06:45

+0

你最後去了'void *'嗎? – DarioP 2014-06-03 15:23:47

回答

4

你仍然可以編寫一個簡單的測試應用程序來比較兩者,它不一定是生產環境。

我的一位同事最近也遇到類似的問題。在他的場景中,不同類型的對象,但他總是事先知道他預期的類型。他的數據結構也很龐大,所以記憶是一個問題。他通過使用void *reinterpret_cast解決了這個問題。這可以防止多態性的內存開銷,並且速度非常快。儘管如此,你必須確定自己在做什麼,否則事情就會爆炸。

3

看代碼,get<>是使用boost::variant的內部訪客機制實現的。反過來,訪客機制依賴於mpl序列,並且它是一步一步執行的。這意味着至多n步驟n類型變體,但循環(遞歸調用)在那裏。正如太空牛仔建議的那樣,一個小型的性能測試會有幫助。

+0

您的意思是,訪問最後列出的類型比第一個類型需要更長的時間嗎?一個快速測試表明,這似乎並非如此。你確定遞歸不是編譯時? – UncleBens 2010-10-22 15:20:53

+0

UncleBens:查看它兩次,搜索展開到給定的限制(對於我所看到的是實際的mpl列表大小限制,無論它是什麼)。然後,該調用是遞歸的。所以,是的,也許多達10種左右,沒有遞歸調用,但正如你所說,再次,小測試沒有什麼比。 – 2010-10-22 17:26:00