首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C代码优化

C代码优化
EN

Stack Overflow用户
提问于 2016-06-29 18:41:38
回答 6查看 778关注 0票数 1

我试图优化一些C代码,这是我第一次。作为第一步,我转储了我的可执行文件,以查看汇编程序代码。例如,对于此函数:

代码语言:javascript
复制
void init_twiddle(int N)
{
  int i=0;
  for(i=0; i<ELEMENTS_HALF; i++)
  {    
     twiddle_table[i].re = (float)   cos((float)i * 2.0 * PI / (float)N);
     twiddle_table[i].im = (float) - sin((float)i * 2.0 * PI / (float)N);
  }
}

如果我这样做不会更好:

代码语言:javascript
复制
    void init_twiddle(int N)
{
  int i=0;
  float puls = 2.0 * PI / (float)N;
  for(i=0; i<ELEMENTS_HALF; i++)
  {    
     twiddle_table[i].re = (float)   cos((float)i * puls);
     twiddle_table[i].im = (float) - sin((float)i * puls);
  }

为了避免重复数千次的多媒体操作和div操作

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2016-06-29 19:06:42

不幸的是,你的第一步已经错了。

不要盲目地遍历优化任意循环的代码,这些循环可能或者(更可能)不会影响性能(可能是因为该代码很少被调用,以至于它并不真正使用任何运行时)。

优化的意思是:你首先需要知道我的程序在哪里花费的时间?使用定时测量来缩小程序大部分时间的使用范围(您可以使用本地日志记录,使用美国计时器或分析应用程序)。如果没有一些数据,您甚至都不会看到编译器已经帮助了您哪些地方,并且可能已经最大限度地排除了所有的可能性,即使您的代码看起来有一些更快的潜力(现代编译器确实非常擅长这一点)。

只有当您了解应用程序中的热点时,才应该开始优化这些热点。

票数 5
EN

Stack Overflow用户

发布于 2016-06-29 18:50:58

问题是它是一个浮点表达式,浮点运算是不可交换的。因此,对于遵循IEEE 754的编译器来说,优化通常是无效的。因此,要么您必须手动进行此优化,要么您必须告诉编译器将浮点数作为优化目的的交换(在gcc和clang中,您使用-ffast-math来完成此操作)。这将在结果值中引入一些细微的变化。

用于比较程序集:

票数 3
EN

Stack Overflow用户

发布于 2016-06-29 19:09:37

你可以做得更快,实际上你只需要一个正弦和一个余弦(这是灾难性的慢)。你要做的是计算一个小矢量的坐标,你在原点旋转,另一种方法是在原点旋转这个矢量,一步一步。单步旋转矩阵是单个正弦和余弦的代价。

当然,这可能有点不准确,但是如果你做了一个合理的步骤,就不会有什么大麻烦了。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38107710

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档