-1

私は次のコードを持っています:

char stats[109]; /* !LINE UNDER QUESTION! */
sprintf(stats,
    "OBJECTS:\n%u/256\n" \
    "BLOCKS:\n%u/" GP_ConstantExpand(Map_MaxLightmaps) "\n" \
    "QUADS:\n%u/" GP_ConstantExpand(Map_MaxLightmaps) "\n" \
    "LIGHTMAPS:\n%u/" GP_ConstantExpand(Map_MaxLightmaps) "\n" \
    "CHECKPOINTS:\n%u/256\n" \
    "HINTS:\n%u/256",
    Map_This_Header.objects, Map_This_Header.blocks, Map_This_QuadCount,
    lmapcount, Map_This_Header.checkpoints, Map_This_Header.hints);

109文字の配列を静的に割り当てるのは問題ありませんか(私のテキストには10​​9で十分です)、または配列を128バイトに揃えるとパフォーマンスが向上しますか?

ファイルサイズやメモリ使用量は気にしません。パフォーマンスは私にとって重要です。古いコンピューターでは、コードを60FPSで実行する必要があります。

4

2 に答える 2

2

これは、コードが実行されるハードウェアにあまりにも関連していると思います。たとえば、配列の周りのスタックに他の変数が割り当てられていると仮定すると、これに答えるために2つの反対の引数を考えることができます。

  • 配列を小さく保つと、頻繁に使用されるすべての変数を保持するために使用されるキャッシュエントリの数が減ります。
  • サイズを2の累乗で調整し、配列のアドレスがCPUの1つのレジスタにある場合、CPUのアドレッシングモードによっては、直後の変数のアドレスの計算が簡単になる場合があります。たとえば、ARMはビットフィールドを取得してシフトするため、0x12001よりも0x12000のようなオフセットをエンコードする方が簡単です。

ただし、2番目の引数は、インスタンス化できる多くの変数のうち1つの変数にのみ影響するため、あまり関連性がないようです。いずれにせよ、確実にしたい場合は、コードのベンチマークを行う必要があります。

于 2012-06-15T12:29:59.563 に答える
0

調整するとパフォーマンスが向上する場合、コンパイラーは適切な最適化レベルで調整する必要があります。これは、コンパイラーが自動変数を自由に並べ替えることができるためです。

一般に、コードが実際に動作するように整列する必要がある場合を除いて(たとえば、ポインターフィールドの下位ビットに整数を格納しているため、実際のベースポインターをより大きな境界に整列する必要がある場合)、すべきではありません。このような仮定をコードにコーディングします。

于 2012-06-15T14:48:45.480 に答える