Files
astro/basic/solar_eclipse_perf_bench_test.go
T
b612 2bf8478639 feat: 完善日月食与月掩几何链路并扩展历法接口
- 新增日月食中心带、偏食带、阴影足迹、等时线、食分线及升落边界计算,支持极区与混合食拓扑
- 新增日食单时刻阴影求解器、站心状态查询、批量采样和 ΔT 覆盖接口
- 重构恒星与行星月掩路径,补充有限盘面接触、站心修正、掩带宽度、极区投影及升落边界
- 扩展 SVG 与 GeoJSON 输出,支持详细面板、全球/极区/地球投影、边界闭合、时间标记和拓扑签名
- 扩展日月食候选搜索、局地搜索、沙罗序列预计算与范围外推,补充系列锚点和成员一致性校验
- 补齐古历纪年、儒略历独有闰日、多公历候选、历法改革跨日及精确日期运算接口
- 优化 ΔT、章动、恒星时、月球地平线、事件根搜索和本地星历缓存,降低重复计算开销并提升边界稳定
2026-09-17 12:27:40 +08:00

96 lines
3.3 KiB
Go

package basic
import "testing"
// 性能基线:逐项隔离 §1.4 P2 热点,改动前后跑同一份基准做对照。
func solarEclipseBenchSeed(year, month, day int) float64 {
return JDECalc(year, month, float64(day))
}
func solarEclipseBenchCenterLine(b *testing.B, seed float64) (SolarEclipsePathResult, float64, SolarEclipseRadiusModel) {
b.Helper()
model := SolarEclipseModelNASABulletinSplitK
result := solarEclipse(seed, model)
newMoonJDE := CalcMoonSHByJDE(seed, 0)
solver := newSolarEclipseSolver(newMoonJDE, model)
samplingOptions := SolarEclipsePathOptions{StepDays: 2.0 / 1440.0}
samplingOptions.TargetSpacingKM = 0
centerLine, _ := solver.centralPathPoints(
result.CentralBeginOnEarth, result.CentralEndOnEarth, result.GreatestEclipse, samplingOptions,
)
centerLine = solver.attachCentralAxisContactPoints(
centerLine, result.CentralBeginOnEarth, result.CentralEndOnEarth,
)
return SolarEclipsePathResult{CenterLine: centerLine}, newMoonJDE, model
}
func BenchmarkSolarEclipseCentralPath20240408(b *testing.B) {
seed := solarEclipseBenchSeed(2024, 4, 8)
options := SolarEclipsePathOptions{StepDays: 2.0 / 1440.0, TargetSpacingKM: 150}
b.ResetTimer()
for index := 0; index < b.N; index++ {
SolarEclipseCentralPathNASABulletinSplitK(seed, options)
}
}
func BenchmarkSolarEclipseMaxCentralDuration20240408(b *testing.B) {
path, newMoonJDE, model := solarEclipseBenchCenterLine(b, solarEclipseBenchSeed(2024, 4, 8))
b.ResetTimer()
for index := 0; index < b.N; index++ {
solver := newSolarEclipseSolver(newMoonJDE, model)
solver.centralPathMaxCentralDuration(path.CenterLine)
}
}
func BenchmarkSolarEclipseLimitPairs20240408(b *testing.B) {
path, newMoonJDE, model := solarEclipseBenchCenterLine(b, solarEclipseBenchSeed(2024, 4, 8))
b.ResetTimer()
for index := 0; index < b.N; index++ {
solver := newSolarEclipseSolver(newMoonJDE, model)
solver.centralPathLimitPairs(path.CenterLine)
}
}
func BenchmarkSolarEclipseGlobal20240408(b *testing.B) {
seed := solarEclipseBenchSeed(2024, 4, 8)
b.ResetTimer()
for index := 0; index < b.N; index++ {
SolarEclipseNASABulletinSplitK(seed)
}
}
func BenchmarkSolarEclipseMagnitudeEvaluation(b *testing.B) {
seed := solarEclipseBenchSeed(1136, 6, 1)
solver := newSolarEclipseSolver(CalcMoonSHByJDE(seed, 0), SolarEclipseModelNASABulletinSplitK)
solver = solver.withLocalEphemeris()
jd := solver.newMoonJDE
b.ResetTimer()
for index := 0; index < b.N; index++ {
solver.magnitudeEvaluationAt(jd)
}
}
func BenchmarkSolarEclipsePartialFootprints11360601(b *testing.B) {
seed := solarEclipseBenchSeed(1136, 6, 1)
options := SolarEclipsePartialFootprintOptions{
StepDays: 2.0 / 1440.0, BoundaryPoints: 96, RiseSetStepDays: 2.0 / 1440.0,
}
b.ResetTimer()
for index := 0; index < b.N; index++ {
SolarEclipsePartialFootprintsNASABulletinSplitK(seed, options)
}
}
func BenchmarkSolarEclipseRiseSetArcResidual(b *testing.B) {
seed := solarEclipseBenchSeed(2024, 4, 8)
solver := newSolarEclipseSolver(CalcMoonSHByJDE(seed, 0), SolarEclipseModelNASABulletinSplitK)
solver = solver.withLocalEphemeris()
result := solarEclipse(seed, SolarEclipseModelNASABulletinSplitK)
evaluation := solver.magnitudeEvaluationAt(result.GreatestEclipse)
b.ResetTimer()
for index := 0; index < b.N; index++ {
solarEclipseRiseSetArcResidualAt(evaluation, 10, 40, false)
}
}