私のテスト用の通常の Linux ボックス (カーネル 3.4) では、非常に高速に動作します。しかし、プログラムを別の Linux ボックス (カーネル 3.0) に移動すると、この関数の実行が非常に遅くなり、戻るのに約 2.5 ミリ秒かかります。これは 500 倍遅くなり、大きなパフォーマンスの問題を引き起こします。
では、このような大きな違いの考えられる理由は何でしょうか?
Linux3.0を実行している他のマシンでなぜこれほど遅くなるのかわかりません。カーネルのバグやハードウェアの速度低下など、考えられる理由はたくさんあります。これは経験的に判断できます。まず、問題がカーネルバージョンであるかどうかを確認します。遅いマシンに新しいカーネルをインストールし、それで修正されるかどうかを確認します。それができない場合は、開発マシンに古いカーネルをインストールしてみてください。カーネルのバージョンに基づいていることが判明した場合は、カーネルの履歴を二分して、どのコミットがそれを大幅に高速化したかを把握できます。git bisect
二等分を行う方法の詳細については、を参照してください。カーネルの問題でない場合は、ハードウェアの問題である可能性があります。
何がバグを引き起こしたかに関係なく、あなたはそれを修正したいと思うでしょう。カーネルをアップグレードして修正できない場合は、if_nameindex()
一度呼び出して結果を保存し、その配列で結果を検索することで回避できます。約15個のアイテムの配列を線形にスキャンすると、かなり高速になります。2.5ミリ秒よりもはるかに高速です。
struct if_nameindex* cached_nameindex = NULL;
int if_nametoindex_cached(char *name) {
if (!cached_nameindex) {
cached_nameindex = if_nameindex();
if (!cached_nameindex) {
perror("failed to get nameindex");
exit(1);
}
}
for (struct if_nameindex *ni = cached_nameindex; ni->if_name; ++ni) {
if (!strcmp(ni->if_name, name))
return ni->if_index;
}
return 0;
}