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