2011-05-08 107 views
-1

假设速度位操作的我有有位运营商

x &(num-1) 

其中x是为unsigned long long和num定期int和&是按位与操作。

随着num值的增加,我得到了显着的减速。这是正常的行为吗?

这些都是影响

int* hash = new int[num] 
+4

你是如何测量的?请发布您的时间码。 – 2011-05-08 23:04:26

+0

什么样的减速?当num的大小达到特定的水平时,速度是否突然增加,例如, >“什么可以用一个字节表示”? – 2011-05-08 23:06:45

+0

代码太长..它是一个更大的程序(哈希表)的一部分,包含该操作。这只是当我增加n的幂数为2时,程序变慢...很多 – Jake 2011-05-08 23:07:19

回答

2

我不认为按位运算速度放缓代码的其他部分,我想你使用它很多次。可能它甚至不需要花费太长时间的按位操作,但其他任何事情你也可以做更多次。

使用分析器。

+0

该数字不是任何循环或迭代器的一部分......它仅用于分配更多堆空间 – Jake 2011-05-08 23:18:10

2

如果你在一个紧密的循环中执行代码,那么很可能你会看到性能降低了较高的数字,我是猜测你的C++编译器无法找到本机指令执行&与一个无符号long long - 如你所说你得到一个两个幂的放缓然后我希望从&产生的代码重复“除以num”2,直到它为零执行和逐位。

另一种可能性是,您正在运行的CPU是跛脚的,并且在固定数量的周期内不执行AND操作。

+0

你见过这样的CPU吗? – 2011-05-08 23:43:35

+0

@ralu - 不是我所知道的,尽管他们确实存在这样的CPU,即使他们只是在旧ZX81的attic闲置。 – 2011-05-08 23:45:29

+0

...我站在更正,ZX81(与Z80 CPU)采取一致的7个周期执行与。 :) – 2011-05-08 23:53:30

0

问题已解决。它必须处理CPU缓存和局部性。