c++循环与代码如何优化?

AI视觉网奇
Python领域优质创作者
博客专家认证
2017-03-14 03:39:50
1.c++做图片处理时,需要使用多个for循环,这些循环是合并好还是拆分写性能比较好?
2.fftwf_plan_dft_2d使用了3个,效率不是很高,有什么优化的办法吗?


fftwf_complex * c1 =
(fftwf_complex*) fftwf_malloc(sizeof (fftwf_complex) *size_patch[0]*size_patch[1]);
fftwf_complex * c2 =
(fftwf_complex*) fftwf_malloc(sizeof (fftwf_complex) *size_patch[0]*size_patch[1]);
fftwf_complex * fm1 =
(fftwf_complex*) fftwf_malloc(sizeof (fftwf_complex) *size_patch[0]*size_patch[1]);
fftwf_complex * fm2 =
(fftwf_complex*) fftwf_malloc(sizeof (fftwf_complex) *size_patch[0]*size_patch[1]);
fftwf_complex * caux =
(fftwf_complex*) fftwf_malloc(sizeof (fftwf_complex) *size_patch[0]*size_patch[1]);
fftwf_complex * caux_fft =
(fftwf_complex*) fftwf_malloc(sizeof (fftwf_complex) *size_patch[0]*size_patch[1]);
fftwf_plan p =fftwf_plan_dft_2d(size_patch[1],size_patch[0], fm1, c1, false ? 1 : -1, FFTW_ESTIMATE);
fftwf_plan p2 =fftwf_plan_dft_2d(size_patch[1],size_patch[0], fm2, c2, false ? 1 : -1, FFTW_ESTIMATE);
fftwf_plan p3 =fftwf_plan_dft_2d(size_patch[1],size_patch[0], caux, caux_fft, true ? 1 : -1, FFTW_ESTIMATE);
clock_t startall,endall,start,end;
///////////////////////////////////////
// startall = clock();
float time_1=0,time_2=0,time_3=0,time_4=0;
// fftwf_complex * caux;
float * x1aux;
float * x2aux;
for (int i = 0; i < size_patch[2]; ++i) {
start = clock();
int width = size_patch[0],height = size_patch[1] ;
x1aux = x1+i*width*height;
x2aux = x2+i*width*height;
for (int i = 0; i < height; ++i)
for (int j = 0; j < width; ++j)
{
fm1[i * width + j][0] = x1aux[i*width+ j];
fm1[i * width + j][1] = 0;
fm2[i * width + j][0] = x2aux[i*width+ j];
fm2[i * width + j][1] = 0;
}
fftwf_execute(p);
fftwf_execute(p2);
mulSpectrums( c1, c2, caux, size_patch[0], size_patch[1] ,1);
////// backwards
fftwf_execute(p3);
float ss =(float) (height* width);
float* planes = new float[height* width];
float* rc = planes;
for (int i = 0; i < height*width; ++i){
caux_fft[i][0]*= 1.f /ss;
// caux_fft[i][1]*= 1.f /ss;
(*rc++)= caux_fft[i][0];
}
int w_2 = width / 2;
int h_2 = height / 2;
int step = width;
for(int i=0;i<height;++i){
for(int j=0;j<w_2;++j){
if(i<h_2 ){
swap(planes[i*step+j] , planes[(i+h_2)*step+j+w_2]);
}else if(i>=h_2 ){
swap(planes[i*step+j] , planes[(i-h_2)*step+j+w_2]);
}
}
}
// rearrange(planes,width, height);
for(int i =0;i< height* width;++i){
c[i]+=planes[i];
}
free(planes);
// end = clock();time_4+=1.0*(end-start)/100;
}
fftwf_free(caux);
fftwf_free(caux_fft);
fftwf_free(fm1);
fftwf_free(fm2);
fftwf_free(c1);
fftwf_free(c2);
...全文
348 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-03-14
  • 打赏
  • 举报
回复
引用 2 楼 cutmelon 的回复:
讲真的,我看到这标题脑海里就浮现出楼上这看到过无数次的回复,手贱点进来之后直接吐了
手贱不贱,呕吐不吐和说的对不对无关。
cutmelon 2017-03-14
  • 打赏
  • 举报
回复
讲真的,我看到这标题脑海里就浮现出楼上这看到过无数次的回复,手贱点进来之后直接吐了
赵4老师 2017-03-14
  • 打赏
  • 举报
回复
无profiler不要谈效率!!尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代!

64,647

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧