CRTP比动态调度花费更多的时间

问题描述

下面,我共享了CRTP实现和动态调度的代码。在使用https://godbolt.org/分析编译器代码时,我可以检查CRTP情况下函数调用CRTPInterface :: tick的内层是否没有。该函数未排成一行,因此会浪费更多时间

如何强制编译器使其内联?我试过使用opton -finline-functions,但是没有运气。

CRTP实施:

#include <iostream>
#include <chrono>
using namespace std;
using namespace std::chrono;

template <typename Implementation>
class CRTPInterface {
public:
  void tick(uint64_t n) {
    impl().tick(n);
  }

  uint64_t getvalue() {
    return impl().getvalue();
  }
private:
  Implementation& impl() {
    return *static_cast<Implementation*>(this);
  }
};

class CRTPImplementation : public CRTPInterface<CRTPImplementation> {
  uint64_t counter;
public:
  CRTPImplementation()
    : counter(0) {
  }

  inline void tick(uint64_t n) {
    counter += n;
  }

  uint64_t getvalue() {
    return counter;
  }
};
const unsigned N = 6000;
template <typename Implementation>
void run_crtp(CRTPInterface<Implementation> obj) {
  for (unsigned i = 0; i < N; ++i) {
    for (unsigned j = 0; j < i; ++j) {
      obj.tick(j);
    }
  }
}

int main()
{


    CRTPImplementation crtoObj;
    auto start= high_resolution_clock::Now();
    run_crtp<CRTPImplementation>(crtoObj);


    auto stop= high_resolution_clock::Now();
    auto duration=duration_cast<milliseconds>(stop-start);
    cout<<"Time taken= "<<duration.count()<<endl;



    return 0;
}

o / P:花费的时间= 127

动态调度实施:

#include <iostream>
#include <chrono>
using namespace std;
using namespace std::chrono;

class DynamicInterface {
public:
  virtual void tick(uint64_t n) = 0;
  virtual uint64_t getvalue() = 0;
};

class DynamicImplementation : public DynamicInterface {
  uint64_t counter;

public:
  DynamicImplementation()
    : counter(0) {
  }

  virtual void tick(uint64_t n) {
    counter += n;
  }

  virtual uint64_t getvalue() {
    return counter;
  }
};

const unsigned N = 6000;

void run_dynamic(DynamicInterface* obj) {
  for (unsigned i = 0; i < N; ++i) {
    for (unsigned j = 0; j < i; ++j) {
      obj->tick(j);
    }
  }
}
int main()
{
    DynamicImplementation diobj;

    auto start= high_resolution_clock::Now();
    run_dynamic(&diobj);
    auto stop= high_resolution_clock::Now();
    auto duration=duration_cast<milliseconds>(stop-start);
    cout<<"Time taken= "<<duration.count()<<endl;

    return 0;
}

花费的时间= 57

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)