我使用Dipperstein的bitarray.cpp类来处理图像数据原生存储为一个像素一位的双级(黑白)图像。优化位数组访问
我需要通过每个位迭代,每个图像4--9百万像素的顺序,在数百张照片,使用for循环,是这样的:
for(int i = 0; i < imgLength; i++) {
if(myBitArray[i] == 1) {
// ... do stuff ...
}
}
性能是可用的,但不是很棒。我通过gprof运行该程序,并发现有大量时间和数百万次调用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,但任何人都可以摆脱为什么,例如,标准::矢量::开始(光)被称为几百万次?当然,我能做些什么来加速它?
编辑:我只是放弃和优化搜索功能(循环),而不是。
如果你发布了一些代码,可能会更容易给你加速代码的指针;最好是你的循环的内容。 – DaveR 2009-08-09 00:38:35
能否提供关于'myBitArray'和'imgLength'的更多信息?例如,什么是'myBitArray'类型?是'imgLength == myBitArray.size()'?该配置文件意味着'myBitArray'可能是'std :: vector'...... –
2009-08-09 01:04:45
如果您分享它,则更容易帮助您处理代码。 如果可能,尝试处理循环中的多个位。既然你知道它是一个二进制图像,你可能通过每次读32位来处理每个循环至少32位,而不是只读一个。这会减少你不得不增加访问下一个字节的指针的次数......但这只是猜测。 请认真分享您的代码:) – 2009-08-09 07:54:04