明確にするために、タイトルも少しばかげていると思います。言語のほとんどの組み込み関数が非常によく書かれており、高速であることは誰もが知っています (アセンブリで記述された関数もあります)。私の状況に対するアドバイスがまだいくつかあるかもしれませんが。検索エンジンの動作を示す小さなプロジェクトがあります。インデックス作成フェーズでは、キーワードから不要なものを除外するためのフィルター メソッドがあります。それはここにあります:
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% と非常に高くなります。このフィルターの 3 つの標準関数は、そのパーセンテージにほとんどの時間をstd::remove_if
要します: 6.53%、std::set::find
15.07%、std::transform
7.71% です。
したがって、このフィルターによって命令時間のコストを削減するためにできること (または変更すること) があれば (並列化などを使用するなど)、アドバイスをお願いします。前もって感謝します。
更新: ご提案いただきありがとうございます。簡単に言えば、私がする必要があることを要約しました: 1) マージtolower
しremove_if
、独自のループを作成して 1 つにします。2)より高速な方法unordered_set
の代わりに使用します。したがって、私は を正しい答えとして選択しました。set
find
Mark_B