2011-05-08 111 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緩存和局部性。