我有一個我想優化的函數,因爲它佔用了我程序運行時間的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