• ベストアンサー

素朴な疑問 (C言語とアセンブラの処理速度の違いについて)

C言語で作成したプログラムをビルドして実行ファイルを作成するのと、アセンブラ言語(?)をアセンブルして作成した実行ファイルは、どうして処理速度が違うのでしょうか?例えば全く同じ処理を高級言語と低級言語で作成した場合、出来上がったそれぞれの実行ファイルの違いは、コンパイル時に吸収されてしまうわけではないのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.2

>アセンブラ言語 プログラム作成者が、そのケースだけに、適当と思うようにコーディングします(できます)。=(A) >C言語で作成したプログラムを実行ファイルを作成する これは汎用性(色々のソースのケースに対応できるよう、かつ誤りなく、出来るだけ短く)のあるように、「仕掛け」に基づいて機械語に落とされます。 ただ大切な点は、理論的裏付けがあり、しっかりしてます。 =(B) さらにまた最適化などの、調整処理も行われます。 (A)と(B)は普通異なります。同じ短い課題を2人がコーディングしても相当ことなることは、OKWEB上の回答コーディング例でも良くあります。 だから差がでます。普通(A)<(B)でしょうが、下手なプログラマだと、(A)>(B)かも知れません。(「<」はコーディングステップ数の多少や実行処理時間の多少を意味します。) 個人運送業者に頼むのと、大手宅配業者に頼む例をイメージしました。後者は集配センターなど通ります。良く道を知っている業者なら地道を通り速いが、不慣れだと遅くなるかもしれません。でもシステムとしては後者がしっかり してます。 >コンパイル時に吸収されてしまうわけではないのでしょうか 言っている中味が違います。同じ機械語になってないのですから。 コンパイラなどは、非常に洗練された・進んだ数学・論理・理論のロジックを用いて作られます。素人が一朝一夕に思いつくようなもので作られません。 しかし局部ミクロ的には個人素人プログラマの方が短い・速いコードになるかも知れません。改善の余地はあるのかも。

ketchappt
質問者

お礼

具体的なアドバイスをしていただき、どうもありがとうございます!運送業者の例がわかり易くて参考になりました。言われてみると、アセンブラは機械語を人間が理解できるようにした言語だったのですよね。必要に応じて最小限の処理のみを記述できるアセンブラが、結果として処理速度の速いソフトを開発できるのですね。俄然アセンブラに興味が湧いてきました。どうも有難うございました!

その他の回答 (4)

回答No.5

Cコンパイラが吐き出す機械語コードには速度的に限界があるからです。 たとえば、関数呼び出しのとき、Cコンパイラが作成したコードは一般にスタックを用います。 それに対して、直接アセンブラで記述すればレジスタで引数を渡すことができたりするわけです。 要は、Cコンパイラが吐き出すコードは規則に基づいているので、制約があるけど、直接アセンブラで記述すれば、なんでもありなので、最も最適化されたコードを記述することができるわけです。 ただし、最近のコンパイラは最適化の技術が向上しているため、速度の差は縮まってきているでしょう。

ketchappt
質問者

お礼

コンパイラの技術向上がCとアセンブラの差を縮めるのですね。僕としては、個人的にインラインアセンブラというのに興味が出てきました。ご回答どうも有難うございました!

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.4

C言語とアセンブラをちょっとかじればわかります。 ちなみに普通Cコンパイラはアセンブラではき出せるものがほとんどで、 VisualC++ではアセンブラと混在させてデバッグすることもできますし Cのソースの中にアセンブラを組み込むことも可能です。 どうして実行速度が違うのか。 単純な計算なら 最適化を最大に設定した場合、アセンブラで記述しても Cで記述しても実行速度はほとんど変わりません。 ※アセンブラで組んでも処理に無駄が多ければCより遅くなります。 日々CPUは命令数が増えていますがCのコンパイラはそれを全てサポートしているわけではありません。 例えばVC6.0で8個の配列に同じ足し算をするというコードをアセンブラでみると 8回足し算をしているのですが、MMX命令を使えば1回の処理でできてしまいます。 ※VC7.1はそこまで最適化されるかもしれません 以下のページが参考になるでしょう。

参考URL:
http://www1.kcn.ne.jp/~robe/pf/pf009.html
ketchappt
質問者

お礼

インテルのMMXテクノロジですね。この技術がアセンブラに関わっているなんて、今まで思ってもいませんでした。わかるということは楽しいものですね。ご紹介いただいたサイトは、改めて読ませていただきます。まずはお礼まで・・。アドバイスどうも有難うございました!

  • matyrcry
  • ベストアンサー率47% (101/213)
回答No.3

Cの関数は通常だと呼び出し前のレジスタ状態をスタックに待避させて戻り時に復帰させます。 どこからどんなタイミングで実行されてもいいように安全保障があるわけです。 アセンブラだとそういうことも自分で記述しないと行われません。 ベーシックなんかだとエラー時に即アウトでなくエラーメッセージを表示させるルーチンにジャンプするなど、 高級(?)になるほど目に見えない無駄処理(?)が間にちりばめられるため、処理は重くなります。 保証がない処理は、その分速いけど危ないです。

ketchappt
質問者

お礼

明快なご回答、参考にさせていただきました。どうも有難うございました!

回答No.1

例えば、変数a,bに値を代入して、足し算した結果を変数cに代入する、というプログラムを例にとりましょう。 int a, b; a=1; b=2; c=a+b; こんな感じです。 C言語ではそれぞれ変数はアドレスを持っています。 これをコンパイルすると、 ・変数Aのアドレスが指すメモリ領域に1を書き込む ・変数Bのアドレスが指すメモリ領域に2を書き込む ・レジスタR1に変数Aのアドレスが指すメモリ領域の内容を代入する ・レジスタR2に変数Bのアドレスが指すメモリ領域の内容を代入する ・レジスタR3にR1+R2を代入する ・変数Cのアドレスが指すメモリ領域にレジスタR3の内容を書き込む というような実行ファイルが出来ます。 ところが、アセンブリ言語では、レジスタの使用など自由自在ですから、変数a,bを使わずに、直接レジスタに代入することも出来ます。 ・レジスタR1に1を代入する ・レジスタR2に2を代入する ・レジスタR3にR1+R2を代入する ・変数Cのアドレスが指すメモリ領域にレジスタR3の内容を書き込む これでも、変数Cについての結果は一緒です。 最適化が極限まで行われれば、かなり効率のいいコードが出来ますが、コードの意味にまでは踏み込めないので、双方ともきちんと組んであれば、アセンブラの方が処理速度は速くなります。

ketchappt
質問者

お礼

アセンブラはレジスタに直接書き込むことができるから早いのですね。目から鱗のご回答、どうもありがとうございました!

関連するQ&A