Влияние размера класса на производительность функции-члена - PullRequest
1 голос
/ 10 ноября 2019

Я обнаружил, что на время выполнения функции-члена в классе влияет размер класса при обходе массива объектов. Мне интересно, почему это произошло, и есть ли возможность улучшить скорость?

Реальная проблема, с которой я столкнулся, заключалась в сложном классе с многоуровневым наследованием и виртуальной функцией. Различный размер класса (например, в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...