2

我一直在努力解决一个非常简单的问题......我正在使用 AVL 树处理一个 4 维立方体......现在问题是一个与性能相关的问题......基本上我必须比较数十亿个 64 位数字...... (因为我的密钥是 64 位,包括 16 位的 4 个维度)...

问题不在于我无法比较 2 个 64 位数字,而是我需要在尽可能少的时钟周期内进行比较。

不幸的是,我的 AVL 树模板的签名为“int CompareKeyNode(key k,handle h)”

在引擎盖下我有两个 __int64 数字 lhs 和 rhs,不幸的是这个方法的合同是: 1. lhs==rhs return 0 2. lhs > rhs return 1 3. lhs < rhs return -1

现在,如果上述方法需要一个 __int64 数字,我可以简单地做一个 ( METHOD A ) return lhs - rhs;

不幸的是,它只需要一个 32 位整数,所以我不得不求助于类似于 (( METHOD B )) 的东西,即。返回 lhs == rhs ?0 : (lhs < rhs ? -1 : 1)

对我来说,问题是使用 ( METHOD A ) 加载我的数据需要60秒,而 ( METHOD B ) 需要117秒。

不幸的是(方法 A)是不正确的,因为它在转换 lhs-rhs 语句的返回时会丢失精度。

处理时间对我来说至关重要,我相信现在一定有一个简单有效的答案正在逃避我......

有人知道如何解决这个问题吗?或者有什么建议?

我在 VC++(非托管)中工作,但肯定 .NET/Java 必须在 JITing/VM 阶段解决了这个问题......否则它们会受到巨大的性能影响。

PS:已经尝试过 memcmp() 但还不够好...

4

3 回答 3

0

你可以试试(lhs<rhs) - (rhs<lhs)。不能保证它会(完全)有所改善,但至少有可能......

于 2010-07-06T01:19:30.803 回答
0

我能看到的只是你应该重载或重写函数以接受 __int64。像这样的内联逻辑总是会导致性能损失。为什么你不能重载你的类来接受 __int64?

于 2010-07-06T01:27:57.833 回答
0

在汇编中,减去它们。
零标志集 = 0
进位标志集 = -1
否则 1

于 2010-07-06T00:57:26.723 回答