高いパフォーマンスが要求されるメッセージ処理システムがあります。最近、最初のメッセージが後続のメッセージよりも何倍も長くかかることに気づきました。これがシステムを通過するときに、一連の変換とメッセージの拡張が発生します。その多くは、外部ライブラリを介して行われます。
この問題のプロファイルを作成し(callgrindを使用)、1つのメッセージの「実行」と多くのメッセージの「実行」を比較しました(比較のベースラインを提供します)。
私が見る主な違いは、関数「do_lookup_x」が膨大な時間を費やしていることです。この関数のさまざまな呼び出しを見ると、それらはすべて共通の関数_dl_runtime_resolveによって呼び出されているようです。この関数が何をするのかはわかりませんが、私には、これは、さまざまな共有ライブラリが初めて使用され、次にldによってメモリにロードされているように見えます。
これは正しい仮定ですか?バイナリは、使用の準備が整うまで共有ライブラリをメモリにロードしないため、最初のメッセージで大幅な速度低下が見られますが、後続のメッセージでは見られません。
これを回避するにはどうすればよいですか?
注:マイクロ秒スケールで動作します。