2011-10-15 21 views
0

アセンブリのローカル変数が、私たちが使用するグローバル変数よりも速いのかどうか疑問に思っていました。このための文脈は、本からのwin32 apiを使っていくつかの2Dアニメーションを学んでいることです。作成者は、プログラムのメインウィンドウを初期化する(ウィンドウの作成、登録、表示および更新)機能を使用します。私はasmでその関数を書きました(asmをいくつか実践するだけです)。だから、私が使用しているasm関数では、WNDCLASSEX構造体がローカルに(スタックに)作成されていたので、パフォーマンス上の利点があるかどうか疑問に思っていました。私はアセンブリのローカル変数がより速くなるはずですが、別のプログラム(完全にcpp)の逆アセンブルを行っていることを知っています。コンパイラがWNDCLASSEXをローカルに作成することに気付きました。これは話題について私を混乱させました。ですから、asmコードとC++コードの間にパフォーマンスに違いがあるかどうかを知りたいのです。アセンブリ内のローカル変数:グローバル変数よりも高速ですか?

Devjeet

+4

変数またはスコープ(ローカル、グローバル)の概念がアセンブリに存在しません。そして、C++はアセンブリのコンセプトに関して定義されていません。 –

+1

コードはありません。より速いのは難しいです。あなたのコードを変えるCreateWindowなどの呼び出しを考えると無関係です。 –

+2

@cat私は、スタックにある変数はローカルで、データセグメントではグローバルとして割り当てられると考えることができます。 –

答えて

4

スタックの先頭には多くのコードが表示されます。これは、スタックの先頭が通常CPUキャッシュにあることを意味します。これにアクセスすると、他のメモリ領域(.bssなど)にアクセスするよりも高速になります。

しかし、プログラムごとに数回しか呼ばれないCreateWindowのような関数の場合、これは本当に問題ではありません。その差は数百CPUサイクル以下です。コードの他の部分については、その違いが目立つことがあります。しかし重要なことは、同じデータを繰り返し同じことをやっている場合、データもCPUキャッシュに入り、パフォーマンスの差が打ち消されるということです。

2

は、正直に言うと、私はあなたがコンパイラにそのような決定を残すべきだと思います。コンパイラを書いた人々は、コードを最適化するのに多くの人年を費やしています。すべてのアプリケーションの99%についてこのようなことを心配する理由はほとんどありません。 1%のケースでは、コンパイルするときに、アセンブリリストを作成し、コードをチェックすると、1〜2サイクルを稼ぐことができます。

2

判断にあなたのコードを持たずに、私はアドバイスを持っている:

いくつかの日、アセンブリ内のコーディングは速いプログラムを書くのに最適な方法でした。しかし、今日ではサードパーティのライブラリ、複雑なアルゴリズム、コンパイラのスマートな最適化、移植性の問題、CPUとメモリの速度の大幅な向上などでこのアプローチは放棄されています。

コンパイラがそのアセンブリブロックでスマートコードを作成することができないため、手作りのアセンブリコードがコードのパフォーマンスに悪影響を及ぼすことさえあります。

高水準言語のアセンブリでコーディングするともう一つ悪いことが、移植性のコードを妨げています。

注:アセンブリによってコーディングするのに適した機械とシステムがあります。

関連する問題