2012-04-03 9 views
0

私はマイクロチップPICマイクロコントローラのアセンブリプログラミングについて少し知っていますが、私は専門家ではありません。アセンブリでx ++はx = x + 1およびx + = 1よりも効率的ですか?

アセンブリで最も効率的(つまり時間がかかりません)という次の3つのステートメントのうち、誰かが私を説明することができます。

x++ 
x = x + 1 
x += 1 

私はC#とJavaの両方で非常によく知って、私たちは、高レベルのプログラミング言語を考える時には、上記3文の中で、効率に差がないことを確実に知ります。しかし、組立を検討すると効率に違いはありますか?

おかげ

+8

アセンブリへの翻訳方法によって異なりますか? – Mat

+3

コードを分解して自分自身をチェックアウトしてみてはいかがですか? gccで '-S'オプションを使う –

+0

あなたが知っているPICアセンブリについて知っていれば、それはコードの行を最小限にするものです。 – hplbsh

答えて

3

それらはあなたが抽象化の間違ったレベルで作業しているアセンブリ文ではありません。

これらのCのような文の方が速ければ、それらをコンパイルしてアセンブリに組み込み、次にを調べる必要があります。

ブラインド以外のコンパイラでは、3つのケースすべてでまったく同じコードが提供されます。

あなたが脳死コンパイラを持っている場合は、はい、そこにほぼ確実のようなものとの違いでしょう:

inc [memloc] 

と:

lod r1, [memloc] 
inc r1 
sto [memloc], r1 
+0

ありがとうpaxdiablo ..私はあなたのポイントを参照してください..効率は本当にコンパイラだけでなく、マイクロコントローラまたはプロセッサの命令セットに依存します.. –

0

は、コンパイラは、今まで十分にスマートです最高のソリューションを見つけるので、実際にはすべて同じです。コンパイラは、それらを最速のアセンブリコマンドに変換します。だからそれについて考えないでください。 C#またはJavaコードを記述している場合は、最後に考えなければならないことです。

2

我々はこれが「ハイレベル」のあなたの定義に依存

高水準言語を考える時には、上記3文の中で効率の違いはありません。 PythonやRubyなどのスクリプト言語では、xの最小シンボルテーブルの参照があり、スカラーを「ボックスなし」にする必要があります(1をアセンブリ1に変換する)ので、x++x += 1x = x + 1より優れていると思います。

しかし、Cなどのコンパイル言語では、3つのステートメントのすべてが同様のアセンブリコードになることが予想されるため、同等の効率が得られるはずです。ただし、これはコンパイラとその構成(たとえば、 "デバッグ"または "リリース"ビルドを実行している場合)によって異なります。

0

高水準言語で使用すると、これらが同等に効率的になるかどうかを尋ねる場合は、かなり適切なコンパイラを使用すると仮定します。

上記のステートメントに類似した3つの異なるアセンブリ命令を使用する場合は、同等に高速で、おそらくはそうでない場合もあります。あなたのCPUが特殊な "inc"命令を持っていれば、おそらくそれは他のものより少し速いでしょう(命令はおそらくより短く、CPUはより少ないコードを転送する必要があるため)長期的にはメモリ。確かなことは、タイミングが頻繁に指定される命令セットマニュアルを確認することです。いくつかのアーキテクチャでは、これらの種類の質問に答えることができるサイクル精度のシミュレータを入手することもできます。

関連する問題