私はただ興味があり、どこにも答えが見つかりません。通常、たとえば C/C++ では、ループ内のカウンターに整数を使用します。
for (int i=0; i<100; ++i)
しかし、短い整数や char を使用することもできます。私の質問は次のとおりです。パフォーマンスは変わりますか? 数バイト少ないため、メモリの節約はごくわずかです。カウンターが100を超えないことがわかっている場合に、charを使用して害を及ぼすと、私はただ興味をそそられます.
私はただ興味があり、どこにも答えが見つかりません。通常、たとえば C/C++ では、ループ内のカウンターに整数を使用します。
for (int i=0; i<100; ++i)
しかし、短い整数や char を使用することもできます。私の質問は次のとおりです。パフォーマンスは変わりますか? 数バイト少ないため、メモリの節約はごくわずかです。カウンターが100を超えないことがわかっている場合に、charを使用して害を及ぼすと、私はただ興味をそそられます.
おそらく、プラットフォームに「自然な」整数サイズを使用すると、最高のパフォーマンスが得られます。C++ では、これは通常 int です。ただし、違いは小さい可能性が高く、これがパフォーマンスのボトルネックであるとは考えにくいでしょう。
アーキテクチャに依存します。PowerPC では、通常、int 以外 (またはネイティブのワード サイズが何であれ) を使用すると、パフォーマンスが大幅に低下します。たとえば、short や char は使用しないでください。浮きもバッチリです。
異なるため、特定のアーキテクチャでこれを時間調整する必要がありますが、私のテストケースでは、int の代わりに short を使用することで最大 20% の速度低下がありました。
引用はできませんが、short または char を使用すると、パフォーマンスのオーバーヘッドが少し発生することがよくあると聞きました。
これは一時的なスタック変数であるため、メモリの節約はありません。それが存在するメモリはほぼ確実に既に割り当てられており、次の変数はいずれにせよより大きな境界に配置される可能性が高いため、より短いものを使用して何かを保存することはおそらくないでしょう。
for では、任意の法的な型を使用できます。一体型である必要も、組み込みである必要もありません。たとえば、イテレータも使用できます。
for( std::vector<std::string>::iterator s = myStrings.begin(); myStrings.end() != s; ++s )
{
...
}
パフォーマンスに影響を与えるかどうかは、使用する演算子がどのように実装されているかという問題に帰着します。上記の例では、end()、operator!=()、および operator++() を意味します。
これは実際には答えではありません。PowerPC について Crashworks が言ったことを調べているところです。他の人がすでに指摘しているように、ネイティブのワード サイズにマップされる型を使用すると、コードが最短になり、パフォーマンスが最適になります。
$ cat loop.c
extern void bar();
void foo()
{
int i;
for (i = 0; i < 42; ++i)
bar();
}
$ powerpc-eabi-gcc -S -O3 -o - loop.c
.
.
.L5:
bl bar
addic. 31,31,-1
bge+ 0,.L5
short i
の代わりに, を使用するとかなり異なり、int i
同様に機能しないように見えます。
.L5:
bl bar
addi 3,31,1
extsh 31,3
cmpwi 7,31,41
ble+ 7,.L5
いいえ、実際にはパフォーマンスに影響を与えるべきではありません。
ここでこの質問をするよりも、簡単なプログラムを入力して (すでに最も複雑な行を実行済みです)、プロファイルを作成する方がおそらく迅速でした。:-)
FWIW、デフォルトで bignum を使用する言語 (Python、Lisp など) では、ループ カウンターがボトルネックになっているプロファイルを見たことがありません。型タグのチェックはそれほど高価ではありませんが (多くても 2 つの命令で済みます)、おそらく (fix)int と short int の違いよりも大きいでしょう。
float
おそらく、 aまたは aを使用しない限り、そうではありませんdouble
。メモリは安価なので、おそらくint
.
unsigned または size_t は、理論的には、より良い結果をもたらすはずです (うわー、簡単な人たち、私たちは悪のために最適化し、「時期尚早の」ナンセンスを叫ぶ人たちに対して最適化しようとしています。これは新しい傾向です)。
ただし、主に古典的な欠点であるねじ込みという欠点があります。
Google開発者はそれを避けているようですが、stdまたはboostと戦うのはピタです。
プログラムを最適化 (gcc -O など) してコンパイルする場合は問題ありません。コンパイラは整数レジスタを値に割り当て、メモリまたはスタックに格納することはありません。ループがルーチンを呼び出す場合、gcc は変数 r14-r31 のいずれかを割り当てます。これは、呼び出されたルーチンが保存および復元します。そのため、int を使用してください。これにより、コードを読んだ人が驚くことはほとんどありません。