[解決済み] Linuxカーネルのprocess/unlikelyマクロはどのように動作し、どのような利点があるのでしょうか?
2022-03-23 08:45:17
質問
Linuxカーネルの一部を調べていたら、以下のような呼び出しを発見しました。
if (unlikely(fd < 0))
{
/* Do something */
}
または
if (likely(!err))
{
/* Do something */
}
その定義がわかりました。
#define likely(x) __builtin_expect((x),1)
#define unlikely(x) __builtin_expect((x),0)
最適化のためというのはわかるのですが、どのような効果があるのでしょうか?また、それを使うことでどの程度のパフォーマンスやサイズの低下が期待できるのでしょうか?また、少なくともボトルネックとなるコード(もちろんユーザースペース内)において、手間をかける(そしておそらく移植性を失う)だけの価値があるのでしょうか?
解決方法は?
ジャンプ命令の分岐予測を有利にするような命令を出すようにコンパイラに指示するのです。もし予測が正しければ、ジャンプ命令は基本的に自由であり、ゼロサイクルで実行されることになります。一方、予測が外れた場合、プロセッサのパイプラインをフラッシュする必要があり、数サイクルのコストがかかることになる。しかし、ほとんどの場合、予測は正しいので、性能面では有利になります。
このようなパフォーマンスの最適化はすべて、コードが本当にボトルネックになっているか、そしておそらくマイクロな性質から、タイトなループで実行されていることを確認するための広範なプロファイリングの後にのみ実行すべきです。一般的にLinuxの開発者はかなり経験豊富なので、そうしていると想像します。彼らはgccだけをターゲットにしているので、移植性についてはあまり気にしていませんし、生成させたいアセンブリについても非常に近い考えを持っています。
関連
-
Kali Linuxのマウスライトテーマを変更する方法は?マウスカーソルのテーマを変更するためのヒント
-
Centos7のインストールと展開無料のconfluence wikiの(知識ベース)詳細な操作手順
-
deepin20の不正確な時刻表示を調整する方法は?Deepinの時刻補正方法
-
Linux Mint システムの背景画像を変更する方法は? Linuxでデスクトップの背景を変更するためのヒント
-
Linux Mintでフェード効果をオンにする方法は?
-
ディープインシステムの画面解像度を設定する方法は?ディープインシステムの解像度を設定する方法
-
[解決済み] エクスポートされた環境変数を削除する方法を教えてください。
-
[解決済み] g++とgccの違いは何ですか?
-
[解決済み] ls を使用してディレクトリとその合計サイズを一覧表示する
-
[解決済み] bashスクリプトでset -eはどういう意味ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
deepinシステムからログアウトする方法は?deepinシステムからログアウトし、ユーザーを切り替える方法
-
Linux 5.10.10 正式版リリース:NULLポインタの不具合修正など。
-
LinuxでJenkinsプラグインのインストールが遅い場合の解決策
-
deepin20を使って、ドローイングボードで画像を開くには?deepinのお絵かき掲示板で画像を開く2つの方法
-
Process.waitFor()の戻り値の意味するところ
-
[解決済み] ディレクトリInodeと通常ファイルInodeの比較
-
[解決済み] if...else if文を確率で並べるとどのような効果がありますか?
-
[解決済み] GCCのif else文における__builtin_expectの利点は何ですか?
-
[解決済み】g++の最適化レベル-O3は危険か?
-
[解決済み] C++における二重否定