Самый эффективный способ сравнить два числа __int64 и получить -1,0,1 - PullRequest
2 голосов
/ 06 июля 2010

Я боролся с очень простой проблемой ... Я работаю с 4-мерным кубом, используя AVL-деревья ... Теперь проблема связана с производительностью ... В основном мне нужно сравнить миллиарды 64-битных чисел.... (потому что мой ключ 64-битный, состоящий из 4-х измерений по 16 бит каждый) ...

Проблема не в том, что я не могу сравнить 2 64-битных числа, а скорее мне нужно сделать это вкак можно меньше тактов.

К сожалению, мой шаблон дерева AVL имеет подпись "int CompareKeyNode (ключ k, дескриптор h)"

Под капотом у меня есть два числа __int64 lhs & rhsК сожалению, контракт этого метода следующий: 1. lhs == rhs return 0 2. lhs> rhs return 1 3. lhs

Теперь, если вышеуказанный метод ожидал число __int64, я мог бы простосделать ( METHOD A ) возвращаемое lhs - rhs;

К сожалению, для этого нужно только 32-битное целое число, поэтому я должен прибегнуть к чему-то похожему на ((* METHOD B )) т.е.вернуть lhs == rhs?0: (lhs

Проблема для меня заключается в том, что загрузка моих данных с использованием ( METHOD A ) занимает 60 с, а ( МЕТОД B ) занимает 117 секунд.

К сожалению (МЕТОД A) неверен, так как теряет точность при возврате для приведения оператора lhs-rhs.

Время обработки имеет решающее значение для меня, и я уверен, что должен быть простой эффективный ответ, который ускользает от меня прямо сейчас ...

У кого-нибудь есть идеи, как решить эту проблему?Или, может быть, какие-либо предложения?

Я работаю в VC ++ (неуправляемый), но, безусловно, .NET / Java, должно быть, решил эту проблему на этапе JITing / VM ... в противном случае они потерпели бы огромный удар по производительности.

PS: попробовал memcmp (), но недостаточно хорошо ...

Ответы [ 3 ]

0 голосов
/ 06 июля 2010

Вы можете попробовать (lhs<rhs) - (rhs<lhs).Нет гарантии, что это даст улучшение (вообще), но, по крайней мере, возможно , что может ...

0 голосов
/ 06 июля 2010

На самом деле все, что я вижу, это то, что вы должны либо перегрузить, либо переписать функцию для принятия __int64. Ты всегда получишь потерю производительности при такой встроенной логике. Почему вы не можете перегружать свой класс, чтобы принять __int64?

0 голосов
/ 06 июля 2010

В сборке вычтите их.
установлен нулевой флаг = 0
установлен флаг переноса = -1
остальное 1

...