Юлия против скорости С ++ в векторах - PullRequest
3 голосов
/ 04 марта 2020

Я новичок как в Юлии, так и в C ++. Я кодировал проблему с фиксированной точкой в ​​Julia и C ++ на машине windows (на базе Intel) с редактором Atom и компилятором gpp для C ++ (в пределах от Atom до MinGW)

Код Julia:

function _bellman(UU::Any, Vin::Any, K::Any, bet::Any)
    # Step 1: for each possible total wealth I decide how much capital to have tomorrow
    # Step 2: Conditional on the value function of each k', I calcule the new V
    # Step 3: For each pair (c,k'| k0) what is the maximum value function
    # Step 4: Find maximum difference and update
    n      = length(Vin);
    dif0   = 0;
    dif    = 1;
    Vout   = fill(0.0,n,1);
    Kprime = fill(0.0,n,1);
    for row = 1:n
        val0   = UU[row,1]+ bet*Vin[1];
        index = 1;
        for col = 1:n
            val1 = UU[row,col]+ bet*Vin[col];
            if val1>val0
                index = col;
                val0  = val1;
            end
        end
        Vout[row]   = val0;
        dif         = abs(val0-Vin[row]);
        Kprime[row] = K[index];
        if dif>dif0
            dif0 = dif;
        end
    end
return Vout, Kprime, dif; end

В то время как код C ++ (он объявлен в том же. cpp, чем основной как):

tuple<vector<double>,vector<double>,double> _bellman(vector<vector<double>> UU, vector<double> Vin, vector<double> K, double bet) {
    // Step 1: for each possible total wealth I decide how much capital to have tomorrow
    // Step 2: Conditional on the value function of each k', I calcule the new V
    // Step 3: For each pair (c,k'| k0) what is the maximum value function
    // Step 4: Find maximum difference and update
    int n, index,row,col;
    double val0, val1,dif0, dif;
    tuple<vector<double>,vector<double>,double> mytup;
    n= Vin.size();
    vector<double> Vout(n), Kprime(n);
    dif0 = 0;
    for (row = 0; row<n; row++){
        val0 = UU[row][0]+ bet*Vin[0];
        index = 0;
        for (col = 1; col<n; col++){
            val1 = UU[row][col]+ bet*Vin[col];
            if (val1 > val0){
                index = col;
                val0  = val1;
            }
        }
        Vout[row]   = val0;
        dif         = abs(val0-Vin[row]);

        Kprime[row] = K[index];
        if (dif>dif0){
            dif0 = dif;
        }
    }
    mytup = make_tuple(Vout,Kprime,dif);
    return mytup;
}

И компиляция в порядке, и их скорость аналогична для вектора длиной 250 ( UU - это матрица размером 250x250), но когда я увеличиваю размерность до 1000, Джулия быстрее (как в 6 раз). Почему это происходит? Как я могу улучшить производительность моего кода C ++? Большое спасибо, и извините, если вопрос глупый.

...