我试图优化一些C代码,这是我第一次。作为第一步,我转储了我的可执行文件,以查看汇编程序代码。例如,对于此函数:
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);
}
}如果我这样做不会更好:
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操作
发布于 2016-06-29 19:06:42
不幸的是,你的第一步已经错了。
不要盲目地遍历优化任意循环的代码,这些循环可能或者(更可能)不会影响性能(可能是因为该代码很少被调用,以至于它并不真正使用任何运行时)。
优化的意思是:你首先需要知道我的程序在哪里花费的时间?使用定时测量来缩小程序大部分时间的使用范围(您可以使用本地日志记录,使用美国计时器或分析应用程序)。如果没有一些数据,您甚至都不会看到编译器已经帮助了您哪些地方,并且可能已经最大限度地排除了所有的可能性,即使您的代码看起来有一些更快的潜力(现代编译器确实非常擅长这一点)。
只有当您了解应用程序中的热点时,才应该开始优化这些热点。
发布于 2016-06-29 18:50:58
发布于 2016-06-29 19:09:37
你可以做得更快,实际上你只需要一个正弦和一个余弦(这是灾难性的慢)。你要做的是计算一个小矢量的坐标,你在原点旋转,另一种方法是在原点旋转这个矢量,一步一步。单步旋转矩阵是单个正弦和余弦的代价。
当然,这可能有点不准确,但是如果你做了一个合理的步骤,就不会有什么大麻烦了。
https://stackoverflow.com/questions/38107710
复制相似问题