понеділок, 6 квітня 2015 р.

Мікро-оптимізація

Програмую я тут одну задачку, трапився в ній код, наведений нижче. При чому, даний код викликається дуже часто, займаючи третину часу роботи програми.

Код, варіант 1:

double hamiltonian(const FK_GA_c::Individual & _indi)
{
    double sum = 0;
    for (unsigned i = 0; i < _indi.size(); i=i+2) {
        //i -- n_f,
        //i+1 -- n_d
        double n_f_i = _indi[i];
        double n_d_i = _indi[i+1];
        sum-=defparams.mu_f*n_f_i;
        sum-=defparams.mu_d*n_d_i;
        sum+=defparams.U*n_f_i*n_d_i;
        // 
        auto i_plus_1 = i+2; //i+1 в математичному сенсі --- наступний вузол
        // Циклічні граничні умови
        if(i_plus_1>=_indi.size()-1)
            i_plus_1=0;
        double n_f_i_1 = _indi[i_plus_1];
        double n_d_i_1 = _indi[i_plus_1+1];

        double base_hopping = (1-n_d_i)*n_d_i_1;
        double hopping=defparams.t1;
        hopping+=defparams.t2*(n_f_i+n_f_i_1);
        hopping+=defparams.t3*(n_f_i*n_f_i_1);

        hopping*=base_hopping;
        sum+=hopping;
    }
    return -sum;
} 
 
Це давня робоча версія, яка має ряд фундаментальних недоліків, але навряд чи мені буде охота повторювати весь цей цикл модифікацій, про які розповідатиму, заново -- треба зразу нормально писати :-), тому ілюструвати буду на ній. Сподіваюся, пробачите деякі вульгарності.