只是为了澄清一下,我也认为这个标题有点傻。我们都知道该语言的大多数内置函数都写得很好而且速度很快(甚至有一些是用汇编编写的)。虽然可能对我的情况仍有一些建议。我有一个演示搜索引擎工作的小项目。在索引阶段,我有一个过滤方法可以从关键字中过滤掉不必要的东西。它在这里:
bool Indexer::filter(string &keyword)
{
// Remove all characters defined in isGarbage method
keyword.resize(std::remove_if(keyword.begin(), keyword.end(), isGarbage) - keyword.begin());
// Transform all characters to lower case
std::transform(keyword.begin(), keyword.end(), keyword.begin(), ::tolower);
// After filtering, if the keyword is empty or it is contained in stop words list, mark as invalid keyword
if (keyword.size() == 0 || stopwords_.find(keyword) != stopwords_.end())
return false;
return true;
}
乍一看,这些函数(都是 STL 容器的成员函数或标准函数)应该很快,并且在索引阶段不需要太多时间。但是在使用 Valgrind 进行分析后,它的包容性成本filter
高得离谱:33.4%。该过滤器的三个标准函数大部分时间都用于该百分比:std::remove_if
占用 6.53%、std::set::find
15.07% 和std::transform
7.71%。
因此,如果我可以做(或改变)任何事情来减少这个过滤器的指令时间成本(比如使用并行化或类似的东西),请给我你的建议。提前致谢。
更新:感谢您的所有建议。简而言之,我总结了我需要做的事情是:1)通过构建我自己的循环来合并tolower
并合二为一。remove_if
2)使用unordered_set
代替set
更快的find
方法。因此,我选择Mark_B
了 's 作为正确答案。