【发布时间】:2015-09-26 21:30:59
【问题描述】:
我有一个想要优化的函数,因为它占用了我程序运行时间的 13.4%。
此函数返回一个相当大的容器,但大多数调用者不需要整个容器,因为他们只是在数据结构中搜索符合特定条件的元素,然后丢弃容器。但是,有一些调用者会使用整个容器。此外,返回的容器有一个众所周知的最大尺寸,并且通常在每次调用函数时都非常接近该尺寸。
我想优化此函数的一种方法是在调用者只需要搜索特定项目时不生成整个数据结构,因为这将为这些调用者节省大约一半的时间,因为容器几乎总是包含搜索到的项目。是否有可能做到这一点,并且仍然为需要整个容器的调用者提供相同的功能?或者,我是否可以实现一个适用于一种类型的调用者的函数,以及另一个适用于另一种类型的调用者的函数,但让它们以某种方式共享逻辑?这是整个设置的样子:
我要优化的功能:
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();
}
【问题讨论】:
-
您可以尝试在
Bar::generate()中使用static向量,并返回const vector<Foo> &。 -
这是个好主意!那可能会有很大帮助。我试试看。
-
如果您想要两个用例的不同语义,我认为不同的功能绝对是要走的路。因此,类似于 generate_and_find(pred) 和 generate(),在两者都调用的 generate-element 函数或构造函数中具有公共代码。
-
您可以将
my_pred传递给generate函数并让它调用它来计算它应该生成什么。 -
您所有问题的答案都是肯定的,但实施它们需要真正了解您是如何生成数据的,所以我认为您没有提供足够的信息。
标签: c++ optimization