我有一个我想优化的函数,因为它占用了我程序运行时间的13.4%。在C++中,我可以在不生成整个数据结构的情况下找到数据结构吗?
该函数返回一个相当大的容器,但大多数调用者不需要整个容器,因为他们只是在数据结构中搜索符合特定条件的元素,然后抛出容器。但是,有几个呼叫者使用整个容器。此外,返回的容器具有众所周知的最大大小,并且在每次调用该函数时通常都非常接近该大小。
我希望优化此功能的一种方式是,当调用者只需要搜索特定项目时,不会生成整个数据结构,因为这样可以为这些调用者节省大约一半的时间,因为容器几乎总是包含搜索的项目。是否有可能这样做,并且仍然对需要整个容器的调用者具有相同的功能工作?或者,我可以实现一种适用于某种类型调用者的函数,另一种适用于另一种类型调用者,但是它们以某种方式共享逻辑?这是种什么样的整个设置是这样的:我想优化
功能:
vector<Foo> Bar::generate() const {
vector<Foo> results; //Using a vector is arbitrary, it could be any container
results.reserve(100);
int n = 100;
while (n > 0 && this->shouldGenerate(n)) {
n--;
results.emplace_back(...);
}
return results
}
最常见的来电者:
Foo baz(Bar bar) {
vector<Foo> items = bar.generate();
auto it = find_if(items.begin(), items.end(), my_pred);
if (it == items.end()) {
return Foo();
} else {
return *it;
}
}
不常见的来电者:
void Qux::storeGeneratedFoos(Bar bar) {
this->foos = bar.generate();
}
你可以尝试使用'static'矢量在Bar :: generate()中,并返回一个const vector&'。 –
owacoder
这是一个好主意!这可能会有很大帮助。我会试试看。 – Drew
如果您需要两种用例的不同语义,我认为不同的功能绝对是您的选择。所以,像generate_and_find(pred)和generate()这样的东西,通用代码都在调用的generate-element函数或构造函数中。 – Davislor