2013-04-21 109 views
-3

我們正在編寫一些將數據寫入數組的方法(myFunc)。該數組必須是類的一個字段(MyClass)。 實施例:C++:填充數組的時間太長

class MyClass { 
public: 
    MyClass(int dimension); 
    ~MyClass(); 

    void myFunc(); 

protected: 

    float* _nodes; 
}; 

MyClass::MyClass(int dimension){ 
_nodes = new float[dimension]; 
} 

void MyClass::myFunc(){ 
for (int i = 0; i < _dimension; ++i) 
    _nodes[i] = (i % 2 == 0) ? 0 : 1; 
} 

方法myFunc的被稱爲近10000倍,它需要鄰近9-10秒(與其他方法)。

但是,如果我們定義爲myFunc的:

void MyClass::myFunc(){ 
float* test = new float[_dimension]; 
for (int i = 0; i < _dimension; ++i) 
    test[i] = (i % 2 == 0) ? 0 : 1; 
} 

我們PROGRAMM工作更快 - 它需要近2-3秒(如果它是接近10000次卡列斯)。

在此先感謝!

+0

您使用的編譯器是什麼,目標平臺是什麼? – 2013-04-21 08:20:58

+0

目標平臺是Windows x64,編譯器是x86_64-v64-mingw32 4.7.0 – Damir 2013-04-21 08:21:52

+0

這沒有任何意義。你看過彙編程序的功能嗎?我看不出有什麼區別,只有一個測試在堆上,另一個在堆棧上。 – SinisterMJ 2013-04-21 08:23:13

回答

1

如果你想加快調試模式,也許幫助編譯器,嘗試

void MyClass::myFunc(){ 
    float* const nodes = _nodes; 
    const int dimension = _dimension; 
    for (int i = 0; i < dimension; ++i) 
     nodes[i] = (i % 2 == 0) ? 0.0f : 1.0f; 
} 

當然,在現實中,你應着眼於利用釋放模式的一切性能相關。

+0

感謝Daniel,但更改了0到0.0f和1到1.0f(和類似的)沒有幫助 – Damir 2013-04-21 08:53:02

+0

@ user2303872主要點是爲循環添加和使用節點和維度,而不是_nodes和_dimension。 – 2013-04-21 08:54:16

2

這可能會幫助(在任何情況下)

for (int i = 0; i < _dimension;) 
{ 
    test[i++] = 0.0f; 
    test[i++] = 1.0f; 
} 

我假設_dimension是偶數,但很容易解決,如果事實並非如此。

+0

+1 10000除法和10000比較 – fadedreamz 2013-04-21 08:49:11

0

在您的示例代碼中,您不在構造函數中初始化_dimension,而是在MyFunc中使用它。因此,即使您只分配了幾千個條目,您也可能會填充數百萬個條目。在這個例子中,你使用相同的尺寸來創建和填充數組,所以你可能在這種情況下正確初始化它。

只要確保_dimension被正確初始化。

0

這是最快機器。

void MyClass::myFunc(){ 
    float* const nodes = _nodes; 
    const int dimension = _dimension; 
    if(dimension < 2){ 
     if(dimension < 1) 
      return; 
     nodes[0] = 0.0f; 
     return; 
    } 
    nodes[0] = 0.0f; 
    nodes[1] = 1.0f; 
    for (int i = 2; ; i <<= 1){ 
     if((i << 1) < dimension){ 
      memcpy(nodes + i, nodes, i * sizeof(float)); 
     }else{ 
      memcpy(nodes + i, nodes, (dimension - i) * sizeof(float)); 
      break; 
     } 
    } 
} 
+0

如果維度<2 – 6502 2013-04-21 09:13:14

+0

@ 6502會崩潰它很容易修復。 – johnchen902 2013-04-21 09:14:42

+0

事先也很容易想到。現在已經太晚了,飛機墜毀了。 – 6502 2013-04-21 09:35:39

0

試試這個:

memset(test, 0, sizeof(float) * _dimension)); 
for (int i = 1; i < _dimension; i += 2) 
{ 
    test[i] = 1.0f; 
} 

您也可以運行一次此片並存儲在靜態位置的陣列。 對於每個連續迭代,您可以在不進行任何計算的情況下處理存儲的數據。

+0

在大多數現代計算機上傳遞兩次內存會變得更慢 – 6502 2013-04-21 09:34:39

+0

@ 6502這取決於memset的實現。這不是兩次,而是1.5次 – SomeWittyUsername 2013-04-21 09:37:59