微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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 举报,一经查实,本站将立刻删除。