我不得不重写代码,以便我获得至少20%的性能 . 首先,我们得到了一个虚拟课程 . 橘子(o)和苹果(a)从水果中继承 . 新的橘子苹果被存储在一个水果矢量中,所以我将它们分开,两者都有自己的矢量 .

首先我认为这是因为分支预测因为它们有点排序但我也因为缓存行而读取它们,因为相同的对象在同一行上 .

新代码:

double run_experiment(const std::vector<Fruit *> &a, const std::vector<Fruit *> &o, int repeats, int checksum) {
    int total = 0;
    Timer timer;
    timer.start();
    std::cout<<"Size A: " << a.size()<< std::endl;
    std::cout<<"Size O: " << o.size()<< std::endl;
    for (int k = 0; k < repeats; k++) {


        for (int i = 0; i < a.size(); i++) {

            total += a[i]->seeds();

        }
        for (int j = 0; j < o.size(); j++) {

            total += o[j]->seeds();
        }
    }
    std::cout << "total out " << total << std::endl;
    timer.stop();
    assert(total == checksum * repeats);
    return timer.seconds();
}

旧:

double run_experiment(const std::vector<Fruit*>& data, int repeats, int checksum)
{
    int total = 0;
    Timer timer;
    timer.start();
    for (int r = 0; r < repeats; ++r)
    {
        for (int i = 0; i < data.size(); ++i)
        {
            total += data[i]->seeds();
        }
    }
    timer.stop();
    assert(total == checksum * repeats);
    return timer.seconds();
}

大小是10 000,是的大循环必须...