2014-02-18 70 views
2

我目前正在重構遺傳編程系統的一些C++。在當前的代碼中,我有一個全局可用的隨機數生成器對象。它的設置如下全局對象是否比幾個本地實例提供更好的性能?

RNG.h 
RNG.cpp -> Instance created here 

Globals.h -> includes 'RNG.h' 
      -> extern RNG rng; 

OtherClasses -> include 'Globals.h' 

RNG實例爲每個可用線程設置一個生成器向量。我花了很多時間來做這件事。這個全局設置很方便,但是每個翻譯單元的實例可能會更快?圍繞這種需求是否有最佳做法?

它經常說可能會刪除全局變量,但它似乎很適合在這裏。

+0

'但是這可能是每個翻譯單元的實例更快的'據我所知,你不能兩次定義一個變量;?鏈接器肯定會對你大喊 – Paranaix

+0

啊 - 是的,我的意思是創建RNG作爲使用它的類中的成員。 – joeButler

+1

全局變量和本地變量之間沒有性能差異(除非執行特定的寄存器分配),因爲代碼總是在代碼段中。但全局變量是一種可怕的做法,因爲它們呈現代碼線程不安全,傾向於錯誤和無法維護 –

回答

1

我的意思是創建了RNG如在使用它

這可能會降低性能的類的成員,作爲RNG對象實例化和初始化每次創建一個包含一個類的對象它(與程序啓動時的單個初始化相反)。

但是,您可以共享您的對象,例如使用std::shared_ptr或原始指針。然後你只需要在構造函數中將它們傳遞給你的對象。如果沒有提供RNG,您可以創建一個(重載構造函數)。特別是考慮到RNG經常播種,這可能是最好的解決方案。

此外,你可以在你的RNG類中實現一個靜態GetDefault()方法(類似於單例模式,但沒有每個進程的一個對象的限制)。

兩個東西結合可能導致這樣一種實現:

class RNGUser 
{ 
    std::shared_ptr<RNG> m_rng; 

    RNGUser() 
    : m_rng(RNG::GetDefault()) 
    { 
    } 

    RNGUser(std::shared_ptr<RNG> rng) 
    : m_rng(rng) 
    { 
    } 

}; 
+0

是的 - 要點。我想我會創建一次,並通過引用傳遞給需要它的對象。我想這仍然意味着需要知道它的每個對象都需要它在構造函數中。這可能會增加(忽略不計)的性能問題,因爲我設法保留了很多地方的默認構造函數。作爲一個GP系統,我非常快速地生成對象 – joeButler

+0

我剛剛看到您的編輯。靜態訪問方法可能不錯 – joeButler

+0

那麼我提出的解決方案是性能和設計之間的平衡行爲(因爲這在封裝的意義上並不完美),但是如果RNG是您班級的重要組成部分,那麼暴露它可能是甚至更好,因爲它允許更多的靈活性 – Paranaix

相關問題