优化虚函数调用性能:解决循环中Animal::f1(int)调用瓶颈
虚函数调用性能优化问题
问题背景
需要优化虚函数Animal::f1(int)的调用性能(非过早优化)。Animal::f1(int)是纯虚函数,由Dog、Cat、Murderous_Hippo等多个派生类实现。实际场景中f1()作为高CPU负载的回调函数,始终通过基类指针调用(如animal->f1(something)),而非派生类直接调用。
性能分析显示,频繁调用animal->f1(int)仅在如下嵌套循环场景中成为性能瓶颈:
for(Animal* animal : allAnimalInTheWorld){ for(int i : intArraySizeAround1000){ animal->f1(i); } }
已尝试的解决方案
方案1:批量调用封装(速度快但维护成本高)
将回调逻辑封装为接收数组的函数,通过std::function实现批量调用。调用animal->f2(vector_of_int)可提升性能,但每个派生类必须手动调用regg<T>(),维护难度大。伪代码如下:
class Animal{ public: virtual void f1(int)=0; public: std::function<void(const std::vector<int>& v)> f2; public: template<class T> void regg(){ f2=[&](const std::vector<int>& v){ ///<=== 以数组作为参数传递 for(auto i:v){ static_cast<T*>(this)->f1(i); ///<=== 性能提升显著 } }; }; }; class Dog final : Animal{ public: Dog(){ Animal::regg<Dog>(); } };
方案2:deducing this技术(无效)
尝试使用deducing this技术自动注册回调,但由于Animal构造时无法识别自身为Dog实例,方案失效。MCVE示例如下:
#include <iostream> #include <functional> class Animal{ public: virtual void f1(int)=0; public: std::function<void(const std::vector<int>& v)> f2; ///: "deducing this" 技术(此场景下无效) public: template <typename Self> void myReg(this Self&& self) { std::cout<<"Animal::myReg ini self=" <<typeid(decltype(self)).name() <<std::endl; self.f2=[&](const std::vector<int>& v){ for(auto ele:v){ self.f1(ele); } }; } int s=(myReg(),-12); }; class Dog final : public Animal{public: virtual void f1(int param){ std::cout<<(param+1)<<std::endl; ///: 一些关于param的快速但复杂的逻辑 } }; int main(){ Dog d; /// 输出 "self=class Animal",不符合预期 }
需求
寻求一种无需在派生类中添加额外维护代码的方案,解决循环中f1()调用的性能问题。注:CRTP方案虽有效,但维护成本与方案1相近,不考虑。
内容的提问来源于stack exchange,提问作者cppBeginner
相关产品推荐
相关产品推荐

