很抱歉,如果这个问题非常幼稚 我将不得不在我的代码中检查以下条件
0< x< ÿ
代码类似于if(x > 0 && x < y)
系统级的基本问题是 - 目前,对于每个呼叫(电信域术语),我的现有代码都被命中(多次)。所以性能非常关键,现在,我需要添加边界检查检查(在许多位置 - 但每个位置的边界比较不同)。
在非常正常的编码级别,上述比较看起来很幼稚而没有任何问题。但是,当我的统计模块(多次浸入)添加时,性能会下降。
所以我想知道处理上述场景的最佳方法(限制检查技术的最佳方式)。例如,如果位比较比正常比较更好,或者比较可以在更短的时间跨度内进行评估吗?
x是无符号整数(必须检查大于0且小于y)。 y是无符号整数 y是非常数,并且每次比较都有所不同 这里时间是与空间相比的约束 语言 - C ++。
现在,稍后如果我需要将y的属性更改为float / double,是否会有另一种方法来优化检查(即,当y更改为float时,建议的整数优化技术将成为非最优解/双)。
提前感谢任何输入。
PS:使用的操作系统是SUSE 10 64位x64_64,AIX 5.3 64位,HP UX 11.1 A 64.
答案 0 :(得分:2)
与往常一样,首先进行剖析,然后进行优化。但是,鉴于这实际上是一个问题,这些可能是需要考虑的事情:
“无符号且大于零”与“不等于零”相同,通常与比较速度一样快。因此,第一个优化是{{1}}。
确保您进行最有可能使第一个失败的比较,以最大限度地提高短路增益。
如果可能,使用编译器指令告诉编译器最可能的代码路径。这将优化指令预取等。对于GCC,请查看类似this, done in the kernel。
我认为减法和与零等比较的技巧不会有任何好处。如果这是进行小于比较的最有效方法,那么您可以确定您的编译器已经知道它。
答案 1 :(得分:0)
这消除了比较和分支,代价是两次加法;它应该更快:
(x-1) < (y-1)
只要y
保证非零,就可以正常工作。
答案 2 :(得分:0)
您可能不需要将y更改为float或double;你应该努力尽可能多地保持整数。不要将y表示为秒,而是尝试微秒或毫秒(取决于您需要的分辨率)。
无论如何 - 我怀疑你可以改变
if (x > 0 && x < y)
;
到
if ((unsigned int)x < (unsigned int)y)
;
但这可能不会真正提高速度。检查零通常是一个或两个指令(取决于ISA),因此从内存中读取肯定是这里的瓶颈。
在您分析了代码并确定这实际上是性能问题的位置之后,您可以调查调整分支预测器,因为如果它经常被错误预测,那么可能会浪费很多时间。不同的编译器会以不同的方式执行,但有些编译器具有类似__expect(x < 0);
的内在函数,它会告诉预测器假设通常是这种情况。