2013-04-21 48 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