将浮点数写入数组需要太多时间

Posted

技术标签:

【中文标题】将浮点数写入数组需要太多时间【英文标题】:Writing float to array is taking too much time 【发布时间】:2014-04-11 11:23:44 【问题描述】:

我在循环中有以下代码:

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存储到数组和存储float有这么大的区别?

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

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

【问题讨论】:

尝试更改循环迭代顺序。例如,从第一行然后列到反向,报告回来 考虑为变量提供直观、不言自明的名称。 @Lundin 我不知道这是什么任务。但在敏锐的计算领域,它通常更喜欢命名变量,就像在算法描述中(在参考书、文章、TeX 文档等中)一样,通常像 'yk'、'T'、'delta' 等。跨度> 正是尤里所说的。这是基于论文的实现,我从那里保留了名称。 @aiwarrior 我已经在这样做了。矩阵从右到左,从上到下遍历。 y 数组从左到右遍历,而 u 数组从右到左遍历。但即使我让代码沿同一方向遍历,我也遇到了同样的问题。 但在这种情况下,您提供了解释神秘字母实际含义的 cmets。总的来说,在可读性方面,数学有很多要从编程中学习:如果数学公式是由一些奇怪的混淆爱好者编写的,这并不一定意味着你应该混淆你的程序同样差的水平。 【参考方案1】:

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

在 int 和 float 大小相同的系统上,没有理由会出现性能差异。除法是该程序中花费最多时间的部分,并且由于所谓的缓慢操作发生在除法之后,我怀疑您不应该那么相信基准测试结果。

如果你把代码改成

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

应该没有区别,所以如果你体验过,这个工具是不可信的。可能是 yk 变量被优化掉了,所以源代码行与机器代码没有 1:1 对应。

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

不,register 在黑暗时代是一个过时的关键字,当时编译器几乎无法优化任何东西。现代编译器不需要它,它会比程序员做出更好的优化决策。

【讨论】:

我在 Intel I5-2415M @2.3GHz 和 4GB RAM 上测试它。当我这样做时,时间会保持不变。【参考方案2】:

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

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

【讨论】:

【参考方案3】:

这告诉你大约 12% 的时间。

另外 88% 的人在做什么?

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

不要犯醉鬼在路灯下寻找钥匙的错误,因为那是灯所在的地方。

【讨论】:

以上是关于将浮点数写入数组需要太多时间的主要内容,如果未能解决你的问题,请参考以下文章

将浮点数转换为PHP中的字节数组

从文件中读取浮点数/单词/符号并仅将浮点数存储在数组 C++ 中

将浮点数转换为字符串[重复]

将浮点数与数组中的值进行比较时,“TypeError:只能将整数标量数组转换为标量索引”

C++ 将浮点数保存并加载到二进制文件中,由指针寻址

将浮点数格式化为 n 位小数