比较两个__int64数字并获得-1,0,1的最有效方法

时间:2010-07-06 00:54:11

标签: int64

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

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

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

引擎盖下我有两个__int64号码lhs& rhs,遗憾的是这种方法的合同是: 1. lhs == rhs返回0 2. lhs> rhs返回1 3. lhs< rhs返回-1

现在如果上面的方法预期__int64数字,我可以简单地做一个(方法A )返回lhs - rhs;

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

问题在于,使用(方法A )加载我的数据需要 60 秒,而方法B 需要 117 秒。

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

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

有人知道如何解决这个问题吗?或者也许有任何建议?

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

PS:尝试了memcmp()但还不够好......

3 个答案:

答案 0 :(得分:0)

在装配中,减去它们 零标志设置= 0
进旗标志= -1
别的1

答案 1 :(得分:0)

您可以尝试(lhs<rhs) - (rhs<lhs)。不能保证它会给予改进(根本没有),但它至少可以可能它可能......

答案 2 :(得分:0)

我真正能看到的是你应该重载或重写函数以接受__int64。你总是会因为这样的内联逻辑而失去性能。你为什么不能让你的班级重载接受__int64?