c++ - 为大量迭代优化代码

标签 c++ optimization

我目前正在从事一个涉及大量迭代(准确地说是 2^32)的项目。我主要使用 Mathematica 进行大部分计算,但它无法处理那么多的进程。有人向我建议c++可以处理它,所以昨晚我学习了c++并编写了以下代码:

//old code  

代码运行良好,(我检查了较小的参数)但我已经开始运行它 4294967295 = 2^32-1 步,我认为这将花费数百小时。如果有人能告诉我是否有办法优化这段代码以便它运行得更快,我将不胜感激?我没有使用过这种语言的经验,所以我构建这些函数的方式可能看起来很困惑。我认为我的 Ca2step 函数运行得非常高效(我可能错了),而且我认为主要部分中的循环正在减慢一切。我认为必须有更快的方法来完成我想要完成的事情,所以任何帮助都会很棒。 谢谢, 理查德。

=======更新========

非常感谢大家,我真的很感激。好的,这对我来说都是全新的,所以我发现很难理解某些事情的含义。下面是我更新的代码。但是我觉得它仍然很慢。有人建议“并行化”,但我不知道这是什么以及我将如何做?再次感谢,理查德。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

//parameters
int a[32] = {0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0,
             1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1};
int b[32] = {1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 
             1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1};
// Create vector of vectors from arrays to be input into function.
vector<int> va (a, a + sizeof(a) / sizeof(int) );
vector<int> vb (b, b + sizeof(b) / sizeof(int) );

vector< vector<int> > ca2step (long int r, vector< vector<int> > vec)
{
    int rulearray[32] = { 0 };
    for (int pos = 31; pos >= 0; --pos){
        if (r % 2) 
            rulearray[pos] = 1;
        r /= 2;
    }
    int arraya[32] = {0};
    int arrayb[32] = {0};
    for (int i = 0; i < 32; i++) {
        arraya[i] = vec[0][i];
        arrayb[i] = vec[1][i];
    }

    vector< vector<int> > output;
    typedef int t_array[32];
    t_array vll, vl, vr, vrr, vx;

    rotate_copy(arrayb,arrayb+2,arrayb+32,vll);
    rotate_copy(arrayb,arrayb+1,arrayb+32,vl);    
    rotate_copy(arrayb,arrayb+31,arrayb+32,vr);    
    rotate_copy(arrayb,arrayb+30,arrayb+32,vrr);


    for (int i = 0; i < 32; i++) {
        vx[i] = (arraya[i] + rulearray[(31 - (vll[i] + (2 * vl[i]) 
                                           + (4 * arrayb[i]) + (8 * vr[i]) + (16 * vrr[i])))]) % 2;
    }

    output.push_back(vector<int>(arrayb, arrayb+32));
    output.push_back(vector<int>(vx, vx+32));

    return (output);

}

int caevolve ( long int r, vector< vector<int> > vector ){
    int count;
    for(int j=0; j<20; j++){ 
        //run function
        vector = ca2step(r, vector);
    }
    if (vector[0] == va || vector[1] == va) {
        count = 1;
        }
    else{
        count=0;
    }
    return (count);
}

int main ()
{
    vector< vector<int> > vinput;
    vinput.reserve(32);
    vinput.push_back(va);
    vinput.push_back(vb); 
    int counter = 0;

    for(unsigned long long int i=0;i<4294967295;i++){  //4294967295
        counter += caevolve(i, vinput);
        }

    cout<< "Counter : " << counter << endl;

    return 0;

}

最佳答案

除了 C++ 性能之外,您还应该考虑并行化代码并利用多核架构。在我看来,您的问题是执行此操作的经典示例。

关于c++ - 为大量迭代优化代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11583292/

相关文章:

android - 以字符串形式读取文件

java - 矩形网格中正方形网格的最小数量[JAVA]

C++ 如何从一个函数返回多个不同类型的数组

c# - 我应该用 C/C++ 重写我的 DSP 例程,还是我擅长使用 C# 不安全指针?

c++ - 有没有办法禁止 C++ 中的指针比较?

mysql - 我该如何优化这个 MySQL 查询?

Python 瓶颈;确定文件比较功能的最佳 block 大小

C++:从 float 类型 Length

c++ - 如何使用 CoCreateInstance() 获取 com 对象?

matlab - fread() 优化 matlab