Skip to content

Commit

Permalink
Avoid broadcast, add benchmark script
Browse files Browse the repository at this point in the history
  • Loading branch information
charleskawczynski committed Jul 25, 2023
1 parent eeefde0 commit 8143ed6
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 28 deletions.
25 changes: 25 additions & 0 deletions perf/benchmark.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
using PlayingCards
using PlayingCards: AbstractDeck
import Random
Random.seed!(1234)
import PokerHandEvaluator as PHE

struct DummyDeck <: AbstractDeck
cards::Vector{Card}
end
Base.pop!(deck::DummyDeck, n::Int) = ntuple(i->deck.cards[i], n)
Random.shuffle!(deck::DummyDeck) = Random.shuffle!(Random.default_rng(), deck)

function Random.shuffle!(rng::Random.AbstractRNG, deck::DummyDeck)
Random.shuffle!(rng, deck.cards)
return deck
end

function do_work!(deck)
fhe = PHE.FullHandEval(pop!(deck, 7))
shuffle!(deck)
end

deck = DummyDeck(full_deck())
using BenchmarkTools
@benchmark do_work!($deck)
50 changes: 26 additions & 24 deletions src/best_hand_rank_from_n_cards.jl
Original file line number Diff line number Diff line change
Expand Up @@ -22,32 +22,34 @@ function min_hand_rank_compact(hand_rank_1, cards)
end

function best_hand_rank_from_7_cards_full(c)
cards=(c[1],c[2],c[3],c[4],c[5]) # first combination
@inbounds begin
cards=(c[1],c[2],c[3],c[4],c[5]) # first combination

hand_rank = evaluate5(cards)
hand_type = hand_type_binary_search(hand_rank)
hr = (hand_rank, hand_type, cards)
hand_rank = evaluate5(cards)
hand_type = hand_type_binary_search(hand_rank)
hr = (hand_rank, hand_type, cards)

cards=(c[1],c[2],c[3],c[4],c[6]); hr = min_hand_rank_full(hr, cards)
cards=(c[1],c[2],c[3],c[4],c[7]); hr = min_hand_rank_full(hr, cards)
cards=(c[1],c[2],c[3],c[5],c[6]); hr = min_hand_rank_full(hr, cards)
cards=(c[1],c[2],c[3],c[5],c[7]); hr = min_hand_rank_full(hr, cards)
cards=(c[1],c[2],c[3],c[6],c[7]); hr = min_hand_rank_full(hr, cards)
cards=(c[1],c[2],c[4],c[5],c[6]); hr = min_hand_rank_full(hr, cards)
cards=(c[1],c[2],c[4],c[5],c[7]); hr = min_hand_rank_full(hr, cards)
cards=(c[1],c[2],c[4],c[6],c[7]); hr = min_hand_rank_full(hr, cards)
cards=(c[1],c[2],c[5],c[6],c[7]); hr = min_hand_rank_full(hr, cards)
cards=(c[1],c[3],c[4],c[5],c[6]); hr = min_hand_rank_full(hr, cards)
cards=(c[1],c[3],c[4],c[5],c[7]); hr = min_hand_rank_full(hr, cards)
cards=(c[1],c[3],c[4],c[6],c[7]); hr = min_hand_rank_full(hr, cards)
cards=(c[1],c[3],c[5],c[6],c[7]); hr = min_hand_rank_full(hr, cards)
cards=(c[1],c[4],c[5],c[6],c[7]); hr = min_hand_rank_full(hr, cards)
cards=(c[2],c[3],c[4],c[5],c[6]); hr = min_hand_rank_full(hr, cards)
cards=(c[2],c[3],c[4],c[5],c[7]); hr = min_hand_rank_full(hr, cards)
cards=(c[2],c[3],c[4],c[6],c[7]); hr = min_hand_rank_full(hr, cards)
cards=(c[2],c[3],c[5],c[6],c[7]); hr = min_hand_rank_full(hr, cards)
cards=(c[2],c[4],c[5],c[6],c[7]); hr = min_hand_rank_full(hr, cards)
cards=(c[3],c[4],c[5],c[6],c[7]); hr = min_hand_rank_full(hr, cards)
cards=(c[1],c[2],c[3],c[4],c[6]); hr = min_hand_rank_full(hr, cards)
cards=(c[1],c[2],c[3],c[4],c[7]); hr = min_hand_rank_full(hr, cards)
cards=(c[1],c[2],c[3],c[5],c[6]); hr = min_hand_rank_full(hr, cards)
cards=(c[1],c[2],c[3],c[5],c[7]); hr = min_hand_rank_full(hr, cards)
cards=(c[1],c[2],c[3],c[6],c[7]); hr = min_hand_rank_full(hr, cards)
cards=(c[1],c[2],c[4],c[5],c[6]); hr = min_hand_rank_full(hr, cards)
cards=(c[1],c[2],c[4],c[5],c[7]); hr = min_hand_rank_full(hr, cards)
cards=(c[1],c[2],c[4],c[6],c[7]); hr = min_hand_rank_full(hr, cards)
cards=(c[1],c[2],c[5],c[6],c[7]); hr = min_hand_rank_full(hr, cards)
cards=(c[1],c[3],c[4],c[5],c[6]); hr = min_hand_rank_full(hr, cards)
cards=(c[1],c[3],c[4],c[5],c[7]); hr = min_hand_rank_full(hr, cards)
cards=(c[1],c[3],c[4],c[6],c[7]); hr = min_hand_rank_full(hr, cards)
cards=(c[1],c[3],c[5],c[6],c[7]); hr = min_hand_rank_full(hr, cards)
cards=(c[1],c[4],c[5],c[6],c[7]); hr = min_hand_rank_full(hr, cards)
cards=(c[2],c[3],c[4],c[5],c[6]); hr = min_hand_rank_full(hr, cards)
cards=(c[2],c[3],c[4],c[5],c[7]); hr = min_hand_rank_full(hr, cards)
cards=(c[2],c[3],c[4],c[6],c[7]); hr = min_hand_rank_full(hr, cards)
cards=(c[2],c[3],c[5],c[6],c[7]); hr = min_hand_rank_full(hr, cards)
cards=(c[2],c[4],c[5],c[6],c[7]); hr = min_hand_rank_full(hr, cards)
cards=(c[3],c[4],c[5],c[6],c[7]); hr = min_hand_rank_full(hr, cards)
end
return hr
end

Expand Down
10 changes: 6 additions & 4 deletions src/evaluate5.jl
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,12 @@ evaluate5(cards::Card...)::Int = evaluate5(cards)
# based on flush/non-flush:
function evaluate5(t::NTuple{N,Card})::Int where {N}
@assert N == 5
if suit(t[1]) == suit(t[2]) == suit(t[3]) == suit(t[4]) == suit(t[5])
return hash_table_suited[prod(prime.(t))]
else
return hash_table_offsuit[prod(prime.(t))]
@inbounds begin
if suit(t[1]) == suit(t[2]) == suit(t[3]) == suit(t[4]) == suit(t[5])
return hash_table_suited[prod(prime, t)]
else
return hash_table_offsuit[prod(prime, t)]
end
end
end

Expand Down

0 comments on commit 8143ed6

Please sign in to comment.