私はDippersteinのbitarray.cppクラスを使用して、イメージデータがネイティブに1ピクセル1ビットとして保存されるバイレベル(白黒)イメージで作業します。私はそれぞれ、すべてのビットを反復処理する必要がビット配列へのアクセスの最適化
は、画像あたり4--9万画素の順に、画像の何百もの上に、forループを使用して、何かのように:
for(int i = 0; i < imgLength; i++) {
if(myBitArray[i] == 1) {
// ... do stuff ...
}
}
パフォーマンスが使用可能です、驚くべきことではない。私はgprofを通してプログラムを実行し、イテレータとbeginのようなstd::vector
メソッドへのかなりの時間と何百万もの呼び出しがあることを確認します。ここでは、トップ・サンプリング機能があります:
Flat profile:
Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls s/call s/call name
37.91 0.80 0.80 2 0.40 1.01 findPattern(bit_array_c*, bool*, int, int, int)
12.32 1.06 0.26 98375762 0.00 0.00 __gnu_cxx::__normal_iterator<unsigned char const*, std::vector<unsigned char, std::allocator<unsigned char> > >::__normal_iterator(unsigned char const* const&)
11.85 1.31 0.25 48183659 0.00 0.00 __gnu_cxx::__normal_iterator<unsigned char const*, std::vector<unsigned char, std::allocator<unsigned char> > >::operator+(int const&) const
11.37 1.55 0.24 49187881 0.00 0.00 std::vector<unsigned char, std::allocator<unsigned char> >::begin() const
9.24 1.75 0.20 48183659 0.00 0.00 bit_array_c::operator[](unsigned int) const
8.06 1.92 0.17 48183659 0.00 0.00 std::vector<unsigned char, std::allocator<unsigned char> >::operator[](unsigned int) const
5.21 2.02 0.11 48183659 0.00 0.00 __gnu_cxx::__normal_iterator<unsigned char const*, std::vector<unsigned char, std::allocator<unsigned char> > >::operator*() const
0.95 2.04 0.02 bit_array_c::operator()(unsigned int)
0.47 2.06 0.01 6025316 0.00 0.00 __gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >::__normal_iterator(unsigned char* const&)
0.47 2.06 0.01 3012657 0.00 0.00 __gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >::operator*() const
0.47 2.08 0.01 1004222 0.00 0.00 std::vector<unsigned char, std::allocator<unsigned char> >::end() const
... remainder omitted ...
私はC++のSTLと本当に慣れていないんだけど、誰もが、なぜ、例えば、STDに光を当てることができます::ベクトル::()を開始し、数万人と呼ばれています時間?そして、もちろん、私がそれをスピードアップするために何かできるかどうか?
編集:私はちょうどあきらめて、検索機能(ループ)を最適化しました。
は、あなたのコードをスピードアップにポインタを与えることが容易であるかもしれません。好ましくはループの内容です。 – DaveR
'myBitArray'と' imgLength'についてもう少し詳しい情報を提供できますか?たとえば、 'myBitArray'の型は何ですか? 'imgLength == myBitArray.size()'ですか?プロファイルは、 'myBitArray'が' std :: vector 'となることを暗示しています... –
あなたのコードを共有するとコードを助けるのがずっと簡単です。 可能であれば、ループ内の複数のビットを処理してください。バイナリイメージであることを知っているので、おそらく1回だけ読むのではなく、一度に32ビットを読むことで、ループごとに少なくとも32ビットを処理できます。これは、次のバイトにアクセスするためのポインタを増やさなければならない回数を減らしますが、これはちょうど推測です。 あなたのコードを共有してください:) –