Cactus Kev's Poker Hand Evaluator을 통해 읽으면 다음과 같은 문구가 나타납니다.어떤 것이 더 빠릅니까? 작은 배열의 요소를 정렬하거나 배가 시키시겠습니까?
처음에는 손을 먼저 평가자에게 전달하기 전에 먼저 정렬 할 수 있다고 생각했습니다. 그러나 정렬에는 시간이 걸리고 손을 정렬하는 CPU 사이클을 낭비하고 싶지 않았습니다. 나는 다섯 장의 카드가 어떤 순서로 주어 졌는지 신경 쓰지 않는 방법이 필요했습니다.
...
많은 생각을 한 후, 나는 소수를 사용하는 브레인 스톰을 가졌습니다. 나는 각 카드 랭크에 소수 값을 할당 할 것이다 ...이 시스템의 장점은 각 카드 랭킹의 소수를 곱하면 주문에 관계없이 고유 한 제품을 얻을 수 있다는 것이다. 다섯 장의 카드 중 하나.
곱셈은 컴퓨터가 할 수있는 가장 빠른 계산 중 하나이기 때문에 평가 전에 각 손을 정렬해야했던 시간을 수백 밀리 초 줄였습니다.
나는 이것을 믿기가 힘듭니다.
Cactus Kev는 각 카드를 4 바이트 정수로 나타내며 eval_5cards(int c1, int c2, int c3, int c4, int c5)
을 호출하여 손을 평가합니다. 우리는 카드를 1 바이트로 표현하고 포커 핸드를 5 바이트 배열로 표현할 수 있습니다. 고유 한 손을 얻기 위해이 5 바이트 배열을 정렬하는 것은 꽤 빨라야합니다. 그의 접근 방식보다 더 빠릅니까?
우리가 그의 표현 (카드를 4 바이트 정수로)을 유지한다면 어떨까요? 5 개의 정수 배열을 곱하는 것보다 빠르게 정렬 할 수 있습니까? 그렇지 않은 경우 적은 수의 요소를 빠르게 정렬하기 위해 어떤 종류의 하위 수준 최적화를 수행 할 수 있습니까?
감사합니다.
모두에게 좋은 답변입니다. 나는 성능 대 성능 통계를 얻기 위해 승수를 정렬하는 성능을 벤치마킹하기 위해 노력하고 있습니다.
그는 승산을 사용할 필요조차 없습니다 - 등급을 나타 내기 위해 숫자를 다르게 선택하여 더 잘 작동하도록 추가 할 수 있습니다. 그것은 본질적으로 단지 입력 항목의 재정렬 하에서 불변 인 해시 함수입니다. – caf
곱셈은 하드웨어에서 수행되는 원시 연산임을 기억하십시오. 그의 이야기에는 장점이있을 수 있습니다. 이것은 본질적으로 해싱입니다 (그의 해시 함수는 일대일로 매우 빠르게 계산할 수 있습니다). – ldog
이 글을 읽을 때 나는 회의적이었습니다. 최적의 정렬 네트워크는 분명히 느리지 만, 비트 마스크를 사용하고 카드를 결합하면 더 간단했을 것입니다. 그는 계산하기가 더 복잡한 Combinadics를 사용할 수도 있지만 모든 유효한 포커 핸드에 대해 연속적인 범위를 가지므로 해시 테이블을 필요로하지 않고 배열에서 손을 찾을 수 있습니다. –