-4

経験から発見したことについて説明が必要です。char 型の非常に大きなフラット配列があります。配列は合計で 500x500x500 = 125E+6 バイトの長さです。セル内には 0 から 255 までの数値を保持しています。しかし幸いなことに、配列を走査するときは、ゼロ以外の値を持つセルにのみ関心があります。

ここで質問です。実験の結果、セルに対して最小の操作を行うだけでも、ゼロ配列と非ゼロ配列全体を処理するときに膨大な時間がかかることがわかりましたが、以下のような条件を使用すると、

while( index < 125000000 )
{
    if( array[ index ] > 0 )
    {
        // Do some stuff
    }

    index++;
}

実行時間が大幅に短縮されます。実際、配列全体を調べて、ゼロ以外のセルに対する操作を数秒で実行できます。条件のないアプローチの 30 分の実行時間ではありません。

私が必要としているのは、これが機能する理由の説明です! 論文レポートでこの現象を説明する必要があり、科学論文などに関連付けることができれば最善です。

前もって感謝します!

よろしく、 オミッド・アリヤン

4

1 に答える 1

2

char符号なしであるため、範囲 [0,255] の値を保持できると考えているかもしれませんが、実際には符号付きで、範囲 [-128, 127] の値を保持しています (2 の補数を想定)。array[ index ] > 0より大きい値が割り当てられたすべての要素127が負の値を持つため、 が予想よりもはるかに小さいケースの数です。

ゼロ以外の値をチェックすると主張していますが、実際には正の値をチェックしていることに注意してください。

プラットフォームでの範囲を確認できcharます。

#include <limits>
#include <iostream>

int main()
{
  std::cout << static_cast<int>(std::numeric_limits<char>::min()) << std::endl;
  std::cout << static_cast<int>(std::numeric_limits<char>::max()) << std::endl;

  char c = 234;
  std::cout << static_cast<int>(c) << std::endl; // 234 if unsigned, -22 if signed
}
于 2013-08-28T11:11:10.277 に答える