2017-01-03 7 views
1

を呼び出すには、私の教科書には、次の文になり:すべてのプログラム命令のほんの 一部を構成し、分岐や呼び出し命令を除き地域の原理と地域の原則を議論の指示

を、プログラムの実行シーケンシャルです。 したがって、ほとんどの場合、すぐにフェッチされる命令は最後にフェッチされた命令の後に が続きます。

私はこれを信じるのが難しいと感じています。私が遭遇したすべてのコードには、コール命令が多く含まれています。実際、コール命令は実際にはプログラムで最も重要なアクションを実行するように見えます。

プログラムで呼び出し命令の実質的な役割にもかかわらず、誰かがこの概念が真実である理由を詳しく説明できれば、大変感謝します。

+0

"小数"は相対的な用語です。私は、通常、4から5つの非分岐命令ごとに1つの分岐命令があることを賭けるだろう。大学で学んでいるすべての学士号を見ると、コンピュータ会社で働くことを学んだことがうれしいです。 – user3344003

答えて

0

コンピューター上でランダムなバイナリ(cargoパッケージマネージャー)を選択しました。それから私:

  • otool -tvV cargo > assembly
  • でそれを逆アセンブル命令のみを得た:私は、それぞれの出現のリストにLibreOfficeのCalcの中で結果を処理しsort instructions | uniq -c | sort -n > count

cat assembly | awk '{print $2}' > instructions

  • は、各命令をカウント命令。 (私はbrewityのために廃棄された浮遊操作のかなりの数があるので、86%をこれらの合計まで)ここではプログラムのそれぞれを1%以上を占めるものがある:

    | 34.83% | movq | 
    | 7.30% | leaq | 
    | 7.00% | callq | 
    | 6.90% | je  | 
    | 5.61% | movl | 
    | 4.86% | cmpq | 
    | 3.77% | testq | 
    | 3.11% | jmp  | 
    | 2.23% | jne  | 
    | 2.17% | popq | 
    | 2.05% | pushq | 
    | 1.69% | addq | 
    | 1.29% | cmpl | 
    | 1.20% | movabsq | 
    | 1.18% | movb | 
    | 1.05% | xorl | 
    

    分岐の多くは間違いなくありますここで(callqjmpjejne)の呼び出しを続けるだけでなく、非常に多くのメモリ操作。メモリ操作は比較的遅く、プログラムのランタイムの多くを占めています。 movqは1回のメモリ操作であり、プログラムの3分の1以上を占めています!

    CPUキャッシュは、最近参照されたメモリデータをCPUコアに近づけるために使用され、同じデータに対する将来のメモリ操作を高速化します。彼らは、同じメモリ上の操作がしばしば時間的に近い(時間的局所性)ことを示すPrinciple of Localityのためにこれを行うことができる。したがって、メモリデータは、すぐにもう一度必要になるため、キャッシュすることができます。