9

ゲームをプログラミングしていて、配列を使用してボードを表現したいと考えています。多くの反復を行うため、効率を求めています。この場合、int 配列または char 配列の両方がボード表現に便利なようです。int 配列と char 配列で演算を行う場合、効率に違いはありますか?

char配列のすべての要素のサイズは1バイトであるため、メモリ内の表現が異なるため遅くなる可能性があると思います(int表現に少なくとも32ビットある最新のコンピューターを考えてください)...私は正しいですか?

前もって感謝します。

編集:ゲーム ツリーを生成します。そのため、効率が非常に重要であり、時間消費のわずかな違いが大きな違いを生む可能性があります。

4

3 に答える 3

8

どのCPU/秒ですか?

一部の CPU は「何か」より小さいものに直接アクセスできず、コンパイラは個々のバイトにアクセスするために「ロード、シフト、およびマスク」命令シーケンスを生成する必要があります。このケースでは、使用intが勝つはずです。

一部の CPU は問題なくバイトにアクセスできます。この場合 (重要なほど十分なデータが含まれている場合)、問題はキャッシュ サイズやメモリ帯域幅にある可能性があります。そして (少なくとも 80x86 の場合)charより多くのデータが各キャッシュ ラインに詰め込まれているという理由だけで勝つと思います。

どのアルゴリズム用ですか?

SIMD を投げることができれば、char勝つ可能性が高いです。たとえば、128 ビット SIMD では、命令ごとに 16 バイトまたは命令ごとに 4 (32 ビット) 整数を処理できchar、これだけでも 4 倍高速になる可能性があります。

最善のアドバイスは、次のようなものを使用することです。

#ifdef USE_INT
    typedef int thingy
#else
    typedef unsigned char thingy
#endif

その後、プロファイルを作成して、いつでも変更できます。

于 2012-05-20T05:28:40.973 に答える
5

chars は通常 1 バイトでアラインされ、ints は通常 4 バイトでアラインされます。この標準に準拠したマシンで作業していると仮定すると、両方の配列はコンテンツをメモリの連続したブロックとして保存します (int配列は配列の 4 倍のサイズですchar)。したがって、割り当てられたメモリのチャンクをどのように使用するかという点で、どちらも異なることはほとんどありません。

そうは言っても、基礎となるメモリ表現が異なっていたとしても、それがプログラムのスループットに影響を与えるとは思えません。

于 2012-05-20T02:04:57.783 に答える
4

試してみてください。-S フラグを gcc に使用して、アセンブラー コードを取得します。

gcc -Wall -S code.c -o code.s

生成されたコードの長さに明らかな違いがあるかどうかを確認します。違いを判断するにはアセンブラを理解する必要があるため、これが必ずしもすべてではありません。しかし、ヒントが得られるかもしれません - おそらく int と char はほとんど同じでしょう。

型を混在させると、ほぼ確実に char 配列を使用したコードがわずかに遅くなることに注意してください。したがって、データを char 配列に格納してから int 型を使用して「処理」すると、2 つの間で変換が行われるたびに余分な命令が得られる可能性があります。-S で試してみてください。

于 2012-05-20T04:02:43.133 に答える