Skip to content

Commit 1f3baca

Browse files
authored
Regress performance: Use Arc<usize> for more sudoku realism (#272)
* Regress performance: Use `Arc<usize>` for more sudoku realism * Fix branch name
1 parent 57971c4 commit 1f3baca

File tree

2 files changed

+18
-16
lines changed

2 files changed

+18
-16
lines changed

.github/workflows/benchmarks.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ name: Benchmarks (CodSpeed)
33
on:
44
push:
55
branches:
6-
- main
6+
- dev
77
pull_request:
88
workflow_dispatch:
99

benches/sudoku.rs

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,31 @@
11
//! A sudoku solver.
2+
//!
3+
//! Uses `Arc<usize>` for being closer to real versions.
24
// SPDX-License-Identifier: MPL-2.0
35

4-
use std::fmt;
5-
66
use pubgrub::{
77
resolve, DefaultStringReporter, OfflineDependencyProvider, PubGrubError, Range, Reporter,
88
SelectedDependencies,
99
};
10+
use std::fmt;
11+
use std::sync::Arc;
1012
use version_ranges::Ranges;
1113

1214
use criterion::*;
1315

1416
/// The size of a box in the board.
15-
const BOARD_BASE: u8 = 3;
17+
const BOARD_BASE: usize = 3;
1618
/// The size of the board.
17-
const BOARD_SIZE: u8 = BOARD_BASE * BOARD_BASE;
19+
const BOARD_SIZE: usize = BOARD_BASE * BOARD_BASE;
1820

19-
type DP = OfflineDependencyProvider<SudokuPackage, Range<u8>>;
21+
type DP = OfflineDependencyProvider<SudokuPackage, Range<Arc<usize>>>;
2022

2123
#[derive(Clone, Debug, Eq, Hash, PartialEq)]
2224
enum SudokuPackage {
2325
/// Add all known fields.
2426
Root,
2527
/// Version is the value of the cell.
26-
Cell { row: u8, col: u8 },
28+
Cell { row: usize, col: usize },
2729
}
2830

2931
impl fmt::Display for SudokuPackage {
@@ -37,7 +39,7 @@ impl fmt::Display for SudokuPackage {
3739
}
3840
}
3941

40-
fn from_board(b: &str) -> Vec<(SudokuPackage, Range<u8>)> {
42+
fn from_board(b: &str) -> Vec<(SudokuPackage, Range<Arc<usize>>)> {
4143
let mut out = vec![];
4244
for (row, line) in b
4345
.trim()
@@ -57,7 +59,7 @@ fn from_board(b: &str) -> Vec<(SudokuPackage, Range<u8>)> {
5759
row: (row + 1).try_into().unwrap(),
5860
col: (col + 1).try_into().unwrap(),
5961
},
60-
Range::singleton(val as u8),
62+
Range::singleton(val as usize),
6163
));
6264
}
6365
}
@@ -67,7 +69,7 @@ fn from_board(b: &str) -> Vec<(SudokuPackage, Range<u8>)> {
6769

6870
/// Encode all the exclusions from assigning a cell to a value
6971
fn encode_constraints(
70-
dependency_provider: &mut OfflineDependencyProvider<SudokuPackage, Ranges<u8>>,
72+
dependency_provider: &mut OfflineDependencyProvider<SudokuPackage, Ranges<Arc<usize>>>,
7173
) {
7274
for row in 1..=BOARD_SIZE {
7375
for col in 1..=BOARD_SIZE {
@@ -80,7 +82,7 @@ fn encode_constraints(
8082
}
8183
deps.push((
8284
SudokuPackage::Cell { row: row_, col },
83-
Range::singleton(val).complement(),
85+
Range::singleton(Arc::new(val)).complement(),
8486
))
8587
}
8688
// A number may only occur once in a col
@@ -90,7 +92,7 @@ fn encode_constraints(
9092
}
9193
deps.push((
9294
SudokuPackage::Cell { row, col: col_ },
93-
Range::singleton(val).complement(),
95+
Range::singleton(Arc::new(val)).complement(),
9496
))
9597
}
9698
// A number may only occur once in a box
@@ -106,7 +108,7 @@ fn encode_constraints(
106108
row: row_,
107109
col: col_,
108110
},
109-
Range::singleton(val).complement(),
111+
Range::singleton(Arc::new(val)).complement(),
110112
))
111113
}
112114
}
@@ -117,11 +119,11 @@ fn encode_constraints(
117119
}
118120
}
119121

120-
fn solve(board: Vec<(SudokuPackage, Ranges<u8>)>) -> SelectedDependencies<DP> {
122+
fn solve(board: Vec<(SudokuPackage, Ranges<Arc<usize>>)>) -> SelectedDependencies<DP> {
121123
let mut dependency_provider = DP::new();
122124
encode_constraints(&mut dependency_provider);
123-
dependency_provider.add_dependencies(SudokuPackage::Root, 1, board);
124-
match resolve(&dependency_provider, SudokuPackage::Root, 1) {
125+
dependency_provider.add_dependencies(SudokuPackage::Root, Arc::new(1usize), board);
126+
match resolve(&dependency_provider, SudokuPackage::Root, Arc::new(1usize)) {
125127
Ok(sol) => sol,
126128
Err(PubGrubError::NoSolution(mut derivation_tree)) => {
127129
derivation_tree.collapse_no_versions();

0 commit comments

Comments
 (0)