将float写入数组需要花费太多时间

时间:2014-04-11 11:23:44

标签: c profiling performance

我在循环中有以下代码:

ekp = e[k][p];
hkp = h[k][p];
uk = round(ekp);
u[k] = uk;
yk = (ekp - uk) / hkp;
y[p] = yk;

变量按以下方式声明:

float ekp, yk, hkp;
int uk;
float **e, *y, **h;
int *u;

我使用局部变量来存储数组中的值,以便更少地访问它们。当我使用Xcode分析代码时,我获得了总执行时间的9.3%

y[p] = yk;

只有2.7%

u[k] = uk;

为什么在将int存储到数组和存储浮点数之间存在很大差异?

使用以下方式声明变量会更有效吗?

register float ekp, yk, hkp;
register int uk;

3 个答案:

答案 0 :(得分:2)

首先,在没有任何特定系统和硬件的情况下讨论特定程序的性能通常是毫无意义的。

在int和float都具有相同大小的系统上,没有理由存在性能差异。这个部门在这个项目中花费的时间最多,而且由于假设在分部之后发生了缓慢的操作,我怀疑你不应该完全信任基准测试结果。

如果将代码更改为

会发生什么
yk = (ekp - uk) / hkp;
u[k] = uk;
y[p] = yk;

应该没有区别,所以如果你遇到一个,那么这个工具是不可信任的。可能是yk变量被优化掉了,因此源代码行不会与机器代码1:1对应。

  

使用以下方式声明变量会更有效吗?

不,注册是来自黑暗时代的过时关键字,当编译器几乎无法优化任何内容时。现代编译器并不需要它,它将比程序员更好地优化决策。

答案 1 :(得分:0)

注册关键字可以与float一起使用。如果浮点数不适合任何寄存器,那么编译器就会忽略它。 register关键字只是对编译器的建议,它不是强制性的。

至于其他问题,我不确定。我看了汇编代码。您可以尝试http://assembly.ynh.io/查看汇编代码。

答案 2 :(得分:0)

这在12%的时间里告诉你。

其他88%的人在做什么?

如果您尝试this method,您会发现。

不要让醉酒的人在路灯下搜索钥匙是错误的,因为这就是灯光的位置。