これは、C++ での楽な効率改善に関するシーケンスの 2 番目の投稿です。 研究 最初の投稿 でっかいアカウントを安全に!
最も注目を集めたのは、ホットスポットの大部分が人気のある図書館に配置されていることに気付き、私たちはそれを敵対的に使用する立場にあると結論付けた. 主な加害者は std::draw からの目的であり、それを掘り下げてみましょう.
私たちの最初の実装では、入力から取得したキーと値のペアを小売業者に荒廃させた単一のドローを所有しています。 この抽選では 3 つのルックアップを行っています。 支配的なものは否定できません: "値" ファイルをルーティングした後、セットアップ提供されたキーがリージョンであるかどうかを想定する必要があります:
それ以外 if (トークン ==
"価値") {
// 明らか抽選で見上げる。
[2] もしも (entries.get(tokens[1]) != エントリー.中止()) /… */
しかし、さらに2つあるかもしれませんあまり目立たない検索。 古いスキャンの 1 行下の倫理:
それ以外 if
(トークン ==
"価値")
{
もしも (entries.get(トークン[1]) != エントリー.中止())
// 演算子 [] を使用して、ドローであまり目立たない検索を行います。 [2]
結果 += "値:" +
エントリ[トークン[1]] +
'n'
;
それは素晴らしいです、std::draw::operator[] を呼び出すとファンシー
get を検索して、指定されたキーを持つエントリが既に存在する可能性があるかどうかを想定します。 しかし、上記で有効な検索を行ったので、コンパイラによって最適化できなかったか、最適化されなくなったか、または最適化されなくなったのでしょうか? 一応、洗練されていますが、謝辞は滅多にありません。アップ、
"region" ファイルの処理中:
else if (トークン ==
// operator[] "領域")
を介して、抽選でのその他のルックアップ エントリ[トークン[1]] = トークン [2];
もう一度、std::draw::operator[]
の呼び出し*) 検索を行います.
クエストを回避するために引き付ける立場にあるほど重要なものはめったにありません。 "領域" ファイルの処理。 おそらく
std::draw::emplace
を使用して、現在のキーの上書きを設定できます。しかし、間違いなく私たちのプログラムの振る舞いを変えるでしょう。
の処理の範囲内で "value"
を通じて存在しないキーにアクセスできるという事実を悪用する立場にもあります*)std::draw::operator[]
は、その形式のデフォルト コンストラクターを使用してまったく新しい値を作成します。 私たちの場合、おそらく空の文字列である可能性が高いため、出力はおそらく同等のものになる可能性があります:
それ以外 if
(トークン ==
"価値"
)
{ // エントリ] は、存在する場合は現在の値、または空の // ない場合は文字列。 [2]
結果 += "値:" +
エントリ[トークン[1]] +
'n'
;
しかし、そうすることで、存在しないすべてのキーについて抽選に新しいエントリーを挿入することになります!
クリティカルに関連するオプションの値を安全にするための直立した承認は、( によって返されたイテレータを保持することです。 std::draw::get()
: [2]
それ以外 もしも (トークン ==
{ "価値")
// 独身抽選で検索 const entry_map:: const_iterator it = エントリー.get(トークン[1]); [2] それであれば != エントリー.中止()) // ここで、イテレータ中に値を安全に入力できます。 [2]
結果 += "値:" + それ->秒 +
'n' ; それ以外 結果 += "値: n
"
; [2] ++line_count; }
エシカルファンシー初期コードでは、[2]を使ってドローを検索していきますstd::draw::get
ですが、ここではリードをローカル変数に格納しています。 結果は、以前のように entries.discontinue() で想定できるイテレータです。 . ここで、イテレーターがチップ イテレーターになることはめったにない場合、イテレーターを逆参照し、その
秒にアクセスすることで、ドローから値を保護することができます。
メンバー。
うわっ! こんな小さなスイッチで5~9%早く! 適度に正しいですよね? perf:
でホットスポットをもう一度テストしてみましょう。
std::draw::get( で 26% 。 その下にはヒント加害者は std::string::operator<
.
<:string std::string> 15% in トークン化
。 主にstd::vector
::push
% %item_read_more_button%%