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

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

这条线占用了我程序运行时间的 10%。有没有办法通过组装来优化它?(在发布模式下需要 3 行)

顺便说一句,我在其他地方检查了&操作员,这需要很多性能。这并不是说其余的代码非常快。(C# 每个对象需要 9 纳米,我的是 17 纳米)

在这一行之后,我禁用了这个位:

--*object;

也能帮上忙?

4

3 回答 3

2

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

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

于 2012-10-10T17:33:05.337 回答
2

当您处于此优化级别时,您应该启用编译器的汇编输出,以便查看生成的各个指令。如果您为这段代码这样做,我想您会发现该and操作是一条指令,无法真正进一步优化。

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

于 2012-10-10T17:34:42.047 回答
1

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

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

于 2012-10-10T18:10:39.460 回答