通过Cactus Kev 的 Poker Hand Evaluator阅读,我注意到以下陈述:
起初,我认为我总是可以先对手进行分类,然后再将其传递给评估者;但是排序需要时间,我不想浪费任何 CPU 周期来排序。我需要一种不关心五张卡片的顺序的方法。
……
经过深思熟虑,我有了一个使用素数的头脑风暴。我会为十三张牌中的每张牌分配一个素数值……这个系统的美妙之处在于,如果你将手中每张牌的素数相乘,你就会得到一个独特的产品,不管顺序如何五张牌中。
...
由于乘法是计算机可以进行的最快计算之一,如果我们在评估之前被迫对每只手进行排序,我们的时间已经减少了数百毫秒。
我很难相信这一点。
Cactus Kev 将每张牌表示为一个 4 字节整数,并通过调用 来评估手牌eval_5cards( int c1, int c2, int c3, int c4, int c5 )
。我们可以将卡片表示为一个字节,而将扑克牌表示为一个 5 字节的数组。对这个 5 字节数组进行排序以获得独特的手必须非常快。它比他的方法更快吗?
如果我们保留他的表示形式(卡片为 4 字节整数)怎么办?对 5 个整数的数组进行排序是否比将它们相乘更快?如果不是,可以进行哪些低级优化来加快对少量元素的排序?
谢谢!
大家好回答;我正在对排序与乘法的性能进行基准测试,以获得一些硬性能统计数据。