我正在尝试节省内存和时间消耗,在16位短变量中存储32位浮点值。为此,我介绍了这样的转换函数:
typedef short int StoreType;
StoreType FloatToShort( float x ) { return x/k; }
float ShortToFloat( StoreType x ) { return float(x)*k; }
然后我使用第一个函数将输入数据转换为StoreType数组。每次我需要一些值时,我都会提取StoreType数据并使用第二个函数获取浮点值。
但是当我想估计由于内存优化而选择的加速时并比较2种情况:
我看到,在第二种情况下,尽管我的所有预期都是相当小的时间(比如测量误差小于1%时的10%)(计算相同,浮动时现金使用量更大)。 同时,我的算法速度理论上不应该依赖于恐吓的计算结果(即精度)。并且程序的最终结果实际上不会随StoreType更改而改变(差异小于0.2%)。 该程序还包括许多具有转换值的计算,因此与所有计算相比,预期类型转换时间可以忽略不计。
浮点数如何才能使程序更快?
答案 0 :(得分:4)
这看起来像是过早优化的情况。除非您存储数十亿(不仅仅是数百万)的浮点数,否则来回转换的成本将压低读取和写入数据的成本。第一种方法应该始终是将这些浮点数以二进制格式存储为浮点数,并且只有在I / O成为瓶颈时才进行优化。
使用浮点数的替代方法是始终使用固定点表示。主要目的是货币交易的语言通常提供内置的定点表示。 C和C ++是通用语言;他们没有这种内置支持。但是,在C ++中构建定点类并不困难。更好的是,找到某人已经开发的固定点模块,如果这是意图的话。
答案 1 :(得分:2)
在第一种情况下,您正在执行浮点运算以及从float
到short int
的转换(反之亦然)。
在第二种情况下,您具有相同的浮点运算但没有转换。除非我误解了你的问题,否则这就更快了。
答案 2 :(得分:1)
首先,您似乎正在尝试优化不太可能成为瓶颈的区域。其次,这样做会降低性能,原因如下:
1)来回转换将导致不必要的乘法和除法运算。 2)大多数现代架构使用32位字,因此通过尝试将它们存储为16位,可能会引入对齐问题。
如果需要进行优化,请按照Amdahl's Law:“使常见情况快速,罕见情况正确。”
答案 3 :(得分:0)
为了澄清这个问题,你似乎在问为什么A(如下所述)花费的时间多于B(也在下面描述)。
A是:
k
反向缩放数据,将其从float
转换为short
,并将其存储在数组中。short
转换为float
,按k
进行缩放,然后在float
中计算。B是:
k
反比例缩放数据并将其存储在数组中。k
进行缩放,并在float
中计算。如果这是你的问题,答案是A的操作多于B。
还应该注意的是,当StoreType
为float
时,缩放和反向缩放似乎毫无意义。
理论上,通过将数据转换为short
来减小数据的大小可以节省时间,因为使用的内存更少,因此更多数据适合缓存,访问缓存比访问内存更快。但是,对于许多应用程序而言,这不会提供性能优势,因为数据足够小,无论如何都适合缓存float
,或者因为数据足够大,即使在缓存中也不适合缓存它是short
(和/或由于各种原因,您的数据访问模式可能不适合缓存。)