2010-07-06 68 views
2

我一直在努力與一個非常簡單的問題......我正在與使用AVL樹木的4維立方體......現在的問題是性能相關的...基本上,我必須比較數十億的64位數字...(因爲我的密鑰是64位,包括每個16位的四維)...最有效的方法來比較兩個__int64數字並得到-1,0,1

問題不是我無法比較2個64位數字,但我需要儘可能少的時鐘週期。

不幸的是我的AVL樹模板具有的簽名「INT CompareKeyNode(密鑰K,處理八)」

引擎蓋下,我有兩個__int64數字LHS & RHS,這種方法很不幸的合同: 1 。LHS == RHS返回0 2. LHS> RHS返回1 3. LHS < RHS返回-1

現在,如果上述方法中的預期數__int64我可以簡單地做一個(方法A)返回LHS - rhs;

不幸的是,它只需要一個32位的整數,所以我不得不求助於類似於((METHOD B))ie。返回lhs == rhs? 0:(左< RHS -1:1)

到我的問題是,使用(方法A)開秒,而(方法B)開秒加載我的數據。

不幸的是(方法A)是不正確的,因爲它失去了投射lhs -rhs語句的返回精度。

的處理時間是我重要,我相信一定有它躲避我現在一個簡單而有效的答案...

有誰知道如何解決這個問題的想法?或者也許有任何建議?

我正在VC++(un-managed)中工作,但是肯定.NET/Java必須在JITing/VM階段解決了這個問題......否則他們會受到巨大的性能影響。

PS:試過memcmp(),但還不夠好......

回答

0

在組裝時,減去他們。
零標誌設置= 0
進位標誌設置= -1
其他1

+0

不幸的是,它是在C++中,而不是程序集...但很好的答案... – MarineHero 2010-07-06 01:11:35

+0

如果速度是如此關心,它可能實際上值得內聯程序集 - C++允許這樣做。例如,*** http://www.codeproject.com/KB/cpp/edujini_inline_asm。aspx *** 如果當然你可能要學習大會。那麼你也可能會發現,在所有這些工作之後它並不是那麼快! – FastAl 2010-07-06 01:27:28

+0

@MarineHero:有沒有理由不能爲此添加一些內聯程序集? – 2010-07-06 01:27:56

0

你可以嘗試(lhs<rhs) - (rhs<lhs)。不能保證它會有所改進(至少),但至少有可能它可能...

+0

現在爲什麼我沒有想到這個...工程,但仍然比我有...需要130秒比我目前的117. – MarineHero 2010-07-06 01:31:54

+0

@MarineHero:我想這並不讓我感到驚訝 - 大多數編譯器不會將優化「奇怪」代碼的工作放在最佳位置,這絕對是... – 2010-07-06 02:04:18

0

真的,我可以看到的是,你應該重載或重寫函數接受__int64。像這樣的內聯邏輯你總會遇到性能損失。爲什麼你不能讓你的類超載接受__int64?

+0

當然......但是......我不能這樣做,原因如下: 1.我使用相同的基於模板的AVL樹在不同的地方 2.我不想將64位開銷強加到AVL類中,因爲這比我的關鍵比較更重要。 – MarineHero 2010-07-06 02:33:03

相關問題