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

比较两个_uint64数字并得到-1,0,1的最有效方法,int64,Int64,我一直在努力解决一个非常简单的问题。。。我正在使用AVL树处理一个4维立方体。。。现在的问题是一个与性能相关的问题。。。基本上我要比较数十亿个64位数字。。。(因为我的密钥是64位的,包含4个维度,每个维度16位) 问题不是我不能比较2个64位数字,而是我需要在尽可能少的时钟周期内进行比较 不幸的是,我的AVL树模板有一个签名“int CompareKeyNode(key k,handle h)” 在引擎盖下,我有两个64号lhs和rhs,不幸的是,这种方法的合同是: 1.lhs==rhs返回0

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

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

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

在引擎盖下,我有两个64号lhs和rhs,不幸的是,这种方法的合同是: 1.lhs==rhs返回0 2.左侧>右侧返回1 3.左侧<右侧返回-1

现在,如果上面的方法需要一个uu int64数字,我可以简单地执行(方法a)返回lhs-rhs

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

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

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

处理时间对我来说是至关重要的,我相信一定有一个简单有效的答案,而这正是我目前无法回答的

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

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


PS:尝试了memcmp(),但不够好…

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

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

否则1

您可以尝试
(lhs您可以尝试
(lhs我能看到的是,你应该重载或重写函数来接受u int64。这样的内联逻辑总是会导致性能损失。为什么你不能重载类来接受u int64?

我能看到的是,你应该重载或重写函数来接受u int64。你总是你会不能通过C++之类的内联逻辑来实现性能损失。你为什么不能超载你的类来接受“{”?:是否有一些原因使您不能仅为此添加少量内联程序集?是否有一种常见情况-例如,多数是相等的,只有少数是-1或+1?请确保第一种情况。您可能无法比比较相等更快!可能会尝试重新安排其他内容以提高效率,分治多线程等。当然,所有这些都是错误的y fixes.FastAI:下面的汇编程序101代码现在在72秒内加载了我的数据!Tx!static int compare_key_node(key k,handle h){asm{mov eax,dword ptr[h]mov ecx,dword ptr[k]sub ecx,dword ptr[eax+10h]mov edx,dword ptr[ebp+0Ch]sbb edx,dword ptr[eax+14h]mov eax,ecx jz eql jc nga mov eax,1 jmp xxx eql:mov eax,0 jmp xxx nga:mov eax,-1 xxx:}如果速度是一个问题,C++可能是值得的,例如,如果你必须学习汇编,那么你也可以发现在所有的工作之后,它并不是真的快得多。多数是相等的,只有几个-1或+1?确保一个是第一个。你可能不会比比较相等更快!可以尝试重新安排其他事情以提高效率,分治多线程等。当然,所有这些都是肮脏的修复。FastAI:下面的汇编101代码现在在72秒内加载了我的数据!Tx!static int compare_key_节点(键k,句柄h){u asm{mov eax,dword ptr[h]mov ecx,dword ptr[k]sub ecx,dword ptr[eax+10h]mov edx,dword ptr[ebp+0Ch]sbb edx,dword ptr[eax+14h]mov eax,ecx jz eql jc nga mov eax,1 jmp xxx eql:mov eax,0 jmp xxx nga:mov eax},-1 xxx:}现在为什么我没有想到这一点…有效,但比我现在的情况更糟…与我现在的117相比需要130秒。@MarineHero:我想这并不让我感到惊讶——大多数编译器在优化“奇怪”方面没有投入那么多的工作代码,这肯定是…现在为什么我没有想到…工作,但比我现在的更糟…需要130秒,而我现在的117秒。@MarineHero:我想这并不让我感到惊讶——大多数编译器在优化“奇怪”方面没有投入那么多的精力代码,这肯定是…当然…但是…我不能这样做,原因如下:1.我在不同的地方使用相同的基于模板的AVL树2.我不想将64位的开销强加给AVL类,因为这比我的键比较更重要。当然…但是…我不能这样做,原因如下:1.我是我们在不同的地方使用相同的基于模板的AVL树2.我不想将64位的开销强加给AVL类,因为这比我的键比较更重要。