C ++ - 优化一条线

时间:2012-10-10 17:26:38

标签: c++ optimization

if ((*object)&1) { //object is int*

我正在创建GC(垃圾收集器)而且我需要找到更好的检查方法 如果ptr的数据中的第一位被启用。 (如果是的话,然后再做一个代码)

此行占用程序运行时间的10%。 有一种方法可以通过装配来优化它吗? (在发布模式下需要3行)

顺便说一句,我使用&运算符检查了其他地方,这需要很多性能。 这不是其余代码非常快。 (C#每个物体需要9纳米,我的是17纳米)

在此行之后我禁用此位:

--*object;

它也有帮助吗?

3 个答案:

答案 0 :(得分:2)

不。 AND是每个CPU上的1个机器指令;没有更快的方法来检查最低位。

根据您对GC的说法,您的性能问题可能源于缓存未命中。

答案 1 :(得分:2)

当您处于此优化级别时,应启用编译器的程序集输出,以便查看生成的各个指令。如果您对此代码执行此操作,我认为您会发现and操作是单个指令,并且无法进一步优化。

根据if内部代码的复杂程度,您可能会发现您的寄存器已耗尽,并且重新加载的值超出了必要的范围。

答案 2 :(得分:1)

至少在GCC中,您可以使用__builtin_expect (condition, expected_result)宏来优化您显示的if语句的编译器分支预测。但我怀疑这是你的性能问题的真正原因(见我的评论)。

我建议使用C ++(11)智能指针来解决应用程序的内存管理问题。或者(对于C ++ 11标准),您可以使用boost SmartPtr libraryloki SmartPtr或其他实现。