|
15 | 15 | package s2
|
16 | 16 |
|
17 | 17 | import (
|
| 18 | + "fmt" |
18 | 19 | "math"
|
19 | 20 | "math/rand"
|
20 | 21 | "reflect"
|
@@ -193,6 +194,87 @@ func TestRegionCovererSimpleRegionCovering(t *testing.T) {
|
193 | 194 | }
|
194 | 195 | }
|
195 | 196 |
|
| 197 | +const numCoveringBMRegions = 1000 |
| 198 | + |
| 199 | +func BenchmarkRegionCovererCoveringCap(b *testing.B) { |
| 200 | + benchmarkRegionCovererCovering(b, func(n int) string { |
| 201 | + return fmt.Sprintf("Cap%d", n) |
| 202 | + }, |
| 203 | + func(n int) []Region { |
| 204 | + regions := make([]Region, numCoveringBMRegions) |
| 205 | + for i := 0; i < numCoveringBMRegions; i++ { |
| 206 | + regions[i] = randomCap(0.1*AvgAreaMetric.Value(maxLevel), 4*math.Pi) |
| 207 | + } |
| 208 | + return regions |
| 209 | + }) |
| 210 | +} |
| 211 | + |
| 212 | +func BenchmarkRegionCovererCoveringCell(b *testing.B) { |
| 213 | + benchmarkRegionCovererCovering(b, func(n int) string { |
| 214 | + return fmt.Sprintf("Cell%d", n) |
| 215 | + }, |
| 216 | + func(n int) []Region { |
| 217 | + regions := make([]Region, numCoveringBMRegions) |
| 218 | + for i := 0; i < numCoveringBMRegions; i++ { |
| 219 | + regions[i] = CellFromCellID(randomCellIDForLevel(maxLevel - randomUniformInt(n))) |
| 220 | + } |
| 221 | + return regions |
| 222 | + }) |
| 223 | +} |
| 224 | + |
| 225 | +func BenchmarkRegionCovererCoveringLoop(b *testing.B) { |
| 226 | + benchmarkRegionCovererCovering(b, func(n int) string { |
| 227 | + return fmt.Sprintf("Loop-%d-edges", int(math.Pow(2.0, float64(n)))) |
| 228 | + }, |
| 229 | + func(n int) []Region { |
| 230 | + size := int(math.Pow(2.0, float64(n))) |
| 231 | + regions := make([]Region, numCoveringBMRegions) |
| 232 | + for i := 0; i < numCoveringBMRegions; i++ { |
| 233 | + regions[i] = RegularLoop(randomPoint(), kmToAngle(10.0), size) |
| 234 | + } |
| 235 | + return regions |
| 236 | + }) |
| 237 | +} |
| 238 | + |
| 239 | +func BenchmarkRegionCovererCoveringCellUnion(b *testing.B) { |
| 240 | + benchmarkRegionCovererCovering(b, func(n int) string { |
| 241 | + return fmt.Sprintf("CellUnion-%d-cells", int(math.Pow(2.0, float64(n)))) |
| 242 | + }, |
| 243 | + func(n int) []Region { |
| 244 | + size := int(math.Pow(2.0, float64(n))) |
| 245 | + regions := make([]Region, numCoveringBMRegions) |
| 246 | + for i := 0; i < numCoveringBMRegions; i++ { |
| 247 | + cu := randomCellUnion(size) |
| 248 | + regions[i] = &cu |
| 249 | + } |
| 250 | + return regions |
| 251 | + }) |
| 252 | +} |
| 253 | + |
| 254 | +// TODO(roberts): Add more benchmarking that changes the values in the coverer (min/max level, # cells). |
| 255 | + |
| 256 | +// benchmark Covering using the supplied func to generate a slice of random Regions of |
| 257 | +// the given type to choose from for the benchmark. |
| 258 | +// |
| 259 | +// e.g. Loops with [4..~2^n] edges, CellUnions of 2^n random Cells, random Cells and Caps |
| 260 | +func benchmarkRegionCovererCovering(b *testing.B, genLabel func(n int) string, genRegions func(n int) []Region) { |
| 261 | + rc := &RegionCoverer{MinLevel: 0, MaxLevel: 30, LevelMod: 1, MaxCells: 8} |
| 262 | + |
| 263 | + // Range over a variety of region complexities. |
| 264 | + for n := 2; n <= 16; n++ { |
| 265 | + b.Run(genLabel(n), |
| 266 | + func(b *testing.B) { |
| 267 | + b.StopTimer() |
| 268 | + regions := genRegions(n) |
| 269 | + l := len(regions) |
| 270 | + b.StartTimer() |
| 271 | + for i := 0; i < b.N; i++ { |
| 272 | + rc.Covering(regions[i%l]) |
| 273 | + } |
| 274 | + }) |
| 275 | + } |
| 276 | +} |
| 277 | + |
196 | 278 | // TODO(roberts): Differences from C++
|
197 | 279 | // func TestRegionCovererAccuracy(t *testing.T) {
|
198 | 280 | // func TestRegionCovererFastCoveringHugeFixedLevelCovering(t *testing.T) {
|
|
0 commit comments