问题描述
下面,我共享了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 (将#修改为@)