Я обнаружил, что на время выполнения функции-члена в классе влияет размер класса при обходе массива объектов. Мне интересно, почему это произошло, и есть ли возможность улучшить скорость?
Реальная проблема, с которой я столкнулся, заключалась в сложном классе с многоуровневым наследованием и виртуальной функцией. Различный размер класса (например, в 5 раз и в 2 раза больше времени) приведет к значительному сокращению времени. Простой тестовый код и результат отображаются следующим образом:
using namespace std;
#include <chrono>
#include <iostream>
class Base {
public:
virtual void Compute()=0;
};
class A: public Base{
public:
char a[1000];
virtual void Compute(){
int c = 100;
c *= 100;
}
};
class B: public Base{
public:
char a[3000];
virtual void Compute(){
int c = 100;
c *= 100;
}
};
void TestClassMemory(){
int N = 20000;
A* pA = new A[N];
B* pB = new B[N];
int Nloop = 1000;
std::chrono::steady_clock::time_point t1 = std::chrono::steady_clock::now();
for (int i = 0; i<Nloop; i++){
for (int j = 0; j<N; j++){
pA[j].Compute();
}
}
std::chrono::steady_clock::time_point t2 = std::chrono::steady_clock::now();
double dt = std::chrono::duration_cast<std::chrono::duration<double> >(t2 - t1).count();
std::cout << "A time cost: " << dt;
t1 = std::chrono::steady_clock::now();
for (int i = 0; i<Nloop; i++){
for (int j = 0; j<N; j++){
pB[j].Compute();
}
}
t2 = std::chrono::steady_clock::now();
dt = std::chrono::duration_cast<std::chrono::duration<double> >(t2 - t1).count();
std::cout << " B time cost: " << dt << std::endl;
// t1 = std::chrono::steady_clock::now();
// t2 = std::chrono::steady_clock::now();
// dt = std::chrono::duration_cast<std::chrono::duration<double> >(t2 - t1).count();
// std::cout << "C time cost: " << dt << std::endl;
std::cout << "size A: " << sizeof(A) << " size B: " << sizeof(B) << std::endl;
delete [] pA;
delete [] pB;
}
int main(int argc, char** argv)
{
TestClassMemory();
}
Ожидание кода должно иметь те же временные затраты, в то время как результат показывает некоторые ожидания.
A time cost: 0.0429354 B time cost: 0.0652356
size A: 1008 size B: 3008