有没有办法提高这些线的速度?

时间:2017-12-12 11:18:55

标签: c++ optimization

我正在尝试优化一些代码,这些代码在需要的时候运行得非常慢。 The top answer here describes the method I am trying (although I am not 100% sure I am implementing it correctly).

当我随机暂停程序时,在调用堆栈的顶部只重复出现几行,但是我不知道如何在这些行中增加代码性能。

代码的基本功能是使用给定点周围的点的值重复更新点阵。出现第一行的相关代码:

班级定义:

template<typename T> class lattice{
    private:
        const unsigned int N; //size
        std::vector<std::vector<T>> lattice_points =
            std::vector<std::vector<T>>(N,std::vector<T>(N)); //array of points
    protected:
        static double mod(double, double) ;
    public:
        lattice(unsigned int);
        lattice(const lattice&);
        lattice& operator=(const lattice&);
        ~lattice() {};

        T point(int, int) const;
        void set(int, int, T);
        unsigned int size() const;
};

这些行经常出现:

template <typename T>    
T lattice<T>::point(int x, int y) const {    
    return (*this).lattice_points[x % N][y % N]; //mod for periodic boundaries    
};    

template <typename T>    
void lattice<T>::set(int x, int y, T val) {    
    this->lattice_points[x % N][y % N] = val; //mod for periodic boundaries    
};  

他们在这里使用:

angle_lattice update_lattice(const angle_lattice& lat, const parameters& par, double dt) {                    
    std::random_device rd;                                                                                    
    std::mt19937 gen(rd());                                                                                   
    std::uniform_real_distribution<> dis(-0.5,0.5);                                                           

    double sqrtdt = sqrt(dt);                                                                                 
    angle_lattice new_lat(lat.size());                                                                        
    int N = lat.size();                                                                                       
    for(int i=0; i < N; i++) {                                                                                
        for(int j=0; j < N; j++) {                                                                            
            double val = lat.point(i,j)+                                                                      
                      dt*(-par.Dx*( sin_points(lat, i, j, i+1, j) + sin_points(lat, i, j, i-1, j) )           
                         -par.Dy*( sin_points(lat, i, j, i, j+1) + sin_points(lat, i, j, i, j-1) )            
                         -par.Lx/2*( cos_points(lat, i, j, i+1, j) + cos_points(lat, i, j, i-1, j) -2)        
                         -par.Ly/2*( cos_points(lat, i, j, i, j+1) + cos_points(lat, i, j, i, j-1) -2))          
                         +sqrtdt*2*M_PI*par.Cl*dis(gen);                                                      
            new_lat.set(i,j,val);                                                                             
        }                                                                                                     
    }                                                                                                         
    return new_lat;                                                                                           
};                                                                                                            

double sin_points(const angle_lattice& lat, int i1, int j1, int i2, int j2) {                                 
    return sin(lat.point(i1, j1) - lat.point(i2, j2));                                                        
};                                                                                                            

double cos_points(const angle_lattice& lat, int i1, int j1, int i2, int j2) {                                 
    return cos(lat.point(i1, j1) - lat.point(i2, j2));                                                        
};

此处 angle_lattice 只是 lattice ,其中模板参数是一个角度。 set 函数被重载,因此角度为mod 2pi。调用堆栈中出现的唯一其他两个函数是 cos_points sin_points ,以及生成随机数,但我认为后者无法帮助。

有什么可以做的吗?帮助将不胜感激。

编辑:我按照一些建议更改了代码,现在余弦和正弦计算最高。

我不知道是什么

0 个答案:

没有答案