我不得不重写代码,以便我至少获得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();
}
大小为10000,是的,大循环必须是...