Measure delivery output and version costs
This commit is contained in:
85
internal/delivery/performance_test.go
Normal file
85
internal/delivery/performance_test.go
Normal file
@@ -0,0 +1,85 @@
|
||||
package delivery
|
||||
|
||||
import (
|
||||
"crypto/sha256"
|
||||
"encoding/hex"
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"testing"
|
||||
|
||||
internalbuild "gitea.maximumdirect.net/eric/ReleaseKit/internal/build"
|
||||
"gitea.maximumdirect.net/eric/ReleaseKit/internal/gitea"
|
||||
)
|
||||
|
||||
const performanceArtifactSize = 16 << 20
|
||||
|
||||
func BenchmarkPerformanceAssetPreflight(b *testing.B) {
|
||||
result, totalBytes := performanceBuildResult(b)
|
||||
declarations, err := declaredBuildAssets(result)
|
||||
if err != nil {
|
||||
b.Fatal(err)
|
||||
}
|
||||
|
||||
b.Run("Declarations", func(b *testing.B) {
|
||||
b.ReportAllocs()
|
||||
b.SetBytes(totalBytes)
|
||||
b.ResetTimer()
|
||||
b.ReportMetric(float64(totalBytes), "bytes/op")
|
||||
for i := 0; i < b.N; i++ {
|
||||
assets, err := declaredBuildAssets(result)
|
||||
if err != nil || len(assets) != len(declarations) {
|
||||
b.Fatalf("declaredBuildAssets() returned %d assets, err %v", len(assets), err)
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
b.Run("DeclarationsAndLocalVerification", func(b *testing.B) {
|
||||
b.ReportAllocs()
|
||||
b.SetBytes(totalBytes)
|
||||
b.ResetTimer()
|
||||
b.ReportMetric(float64(totalBytes), "bytes/op")
|
||||
for i := 0; i < b.N; i++ {
|
||||
assets, err := declaredBuildAssets(result)
|
||||
if err != nil {
|
||||
b.Fatal(err)
|
||||
}
|
||||
if err := gitea.VerifyLocalAssets(assets); err != nil {
|
||||
b.Fatal(err)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
func performanceBuildResult(b *testing.B) (internalbuild.Result, int64) {
|
||||
b.Helper()
|
||||
outputDir := b.TempDir()
|
||||
data := make([]byte, performanceArtifactSize)
|
||||
for i := range data {
|
||||
data[i] = byte((i*31 + i/251 + 17) % 251)
|
||||
}
|
||||
digest := sha256.Sum256(data)
|
||||
result := internalbuild.Result{
|
||||
Version: "v1.2.3",
|
||||
BinaryName: "releasekit",
|
||||
Targets: []internalbuild.Target{
|
||||
{OS: "linux", Arch: "amd64"},
|
||||
{OS: "windows", Arch: "amd64"},
|
||||
},
|
||||
}
|
||||
for _, target := range result.Targets {
|
||||
name := fmt.Sprintf("releasekit-v1.2.3-%s-%s", target.OS, target.Arch)
|
||||
if target.OS == "windows" {
|
||||
name += ".exe"
|
||||
}
|
||||
path := filepath.Join(outputDir, name)
|
||||
if err := os.WriteFile(path, data, 0o600); err != nil {
|
||||
b.Fatal(err)
|
||||
}
|
||||
result.Artifacts = append(result.Artifacts, internalbuild.Artifact{
|
||||
Path: path, Filename: name, Target: target,
|
||||
SHA256: hex.EncodeToString(digest[:]),
|
||||
})
|
||||
}
|
||||
return result, 2 * performanceArtifactSize
|
||||
}
|
||||
38
internal/gotool/performance_test.go
Normal file
38
internal/gotool/performance_test.go
Normal file
@@ -0,0 +1,38 @@
|
||||
package gotool
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"io"
|
||||
"testing"
|
||||
)
|
||||
|
||||
const performanceDiagnosticSize = 8 << 20
|
||||
|
||||
func BenchmarkPerformanceCombinedOutput(b *testing.B) {
|
||||
for _, testCase := range []struct {
|
||||
name string
|
||||
size int
|
||||
}{
|
||||
{name: "modest", size: 4 << 10},
|
||||
{name: "diagnostic-8MiB", size: performanceDiagnosticSize},
|
||||
} {
|
||||
input := bytes.Repeat([]byte("go tool diagnostic output\n"), (testCase.size+25)/26)
|
||||
input = input[:testCase.size]
|
||||
b.Run(testCase.name+"/discard-forwarding", func(b *testing.B) {
|
||||
b.ReportAllocs()
|
||||
b.SetBytes(int64(len(input)))
|
||||
b.ResetTimer()
|
||||
b.ReportMetric(float64(len(input)), "bytes/op")
|
||||
for i := 0; i < b.N; i++ {
|
||||
writer := &combinedWriter{output: io.Discard}
|
||||
if written, err := writer.Write(input); err != nil || written != len(input) {
|
||||
b.Fatalf("write captured output = %d, err %v; want %d bytes", written, err, len(input))
|
||||
}
|
||||
captured := writer.Bytes()
|
||||
if len(captured) != len(input) {
|
||||
b.Fatalf("captured output = %d bytes, want %d", len(captured), len(input))
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
31
internal/runtimeinfo/performance_test.go
Normal file
31
internal/runtimeinfo/performance_test.go
Normal file
@@ -0,0 +1,31 @@
|
||||
package runtimeinfo
|
||||
|
||||
import (
|
||||
"runtime/debug"
|
||||
"testing"
|
||||
)
|
||||
|
||||
var performanceVersionSink string
|
||||
|
||||
func BenchmarkPerformanceVersion(b *testing.B) {
|
||||
b.Run("Injected", func(b *testing.B) {
|
||||
b.ReportAllocs()
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
performanceVersionSink = version("v1.2.3", debug.ReadBuildInfo)
|
||||
if performanceVersionSink != "v1.2.3" {
|
||||
b.Fatalf("version() = %q, want injected version", performanceVersionSink)
|
||||
}
|
||||
}
|
||||
})
|
||||
b.Run("RealMetadataFallback", func(b *testing.B) {
|
||||
b.ReportAllocs()
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
performanceVersionSink = Version()
|
||||
if performanceVersionSink == "" {
|
||||
b.Fatal("Version() returned an empty version")
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user