blob: 4f4a079e0af74e0be456478102ee6f3920b8d430 [file] [log] [blame]
// Copyright 2024 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package main
import (
"bytes"
"fmt"
"log"
"os"
)
type Benchmark struct {
Name string
Data []float64
}
var perf = []Benchmark{
{Name: "Go 1: Uint64", Data: []float64{2.29656e+00, 3.23495e+00, 2.67690e+00, 3.84810e+00, 2.51320e+00, 1.87559e+00, 4.83222e+00}},
{Name: "PCG: Uint64", Data: []float64{1.52985e+00, 8.03210e+00, 2.46820e+00, 1.13633e+01, 4.19290e+00, 2.21153e+00, 6.86715e+00}},
{Name: "ChaCha8: Uint64", Data: []float64{3.10785e+00, 5.99320e+00, 4.22015e+00, 8.54389e+00, 4.64550e+00, 3.54895e+00, 7.48717e+00}},
{Name: "Go 1: N(1000)", Data: []float64{3.04079e+00, 1.43600e+01, 4.84235e+00, 2.50285e+01, 3.05638e+00, 2.41394e+00, 1.27050e+01}},
{Name: "PCG: N(1000)", Data: []float64{2.47375e+00, 1.03700e+01, 3.88155e+00, 1.49215e+01, 4.09644e+00, 2.31600e+00, 9.82755e+00}},
{Name: "ChaCha8: N(1000)", Data: []float64{4.03063e+00, 8.37230e+00, 5.74820e+00, 1.17947e+01, 4.85670e+00, 3.99968e+00, 1.01725e+01}},
}
var columns = []string{
"amd",
"amd32",
"intel",
"intel32",
"m1",
"m3",
"taut2a",
}
var descs = []string{
"AMD Ryzen 9 7950X",
"AMD Ryzen 9 7950X running 32-bit code",
"11th Gen Intel Core i7-1185G7",
"11th Gen Intel Core i7-1185G7 running 32-bit code",
"Apple M1",
"Apple M3",
"Google Cloud Tau T2A (Ampere Altra)",
}
var svghdr = `<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg height="170" width="400" version="1.1"
xmlns="http://www.w3.org/2000/svg">
<defs>
<style type="text/css"><![CDATA[
text {
font-family: sans-serif, Arial;
font-size: 12px;
}
text.head {
font-weight: bold;
font-size: 14px;
}
]]></style>
</defs>
`
func writeSVG(col int) {
var buf bytes.Buffer
buf.WriteString(svghdr)
y := 5
height := 20
skip := 20
scale := 50.
for _, bench := range perf {
if true || bench.Data[col] > 10 {
scale = 25
break
}
}
fills := []string{
"#ffaaaa",
"#ccccff",
"#ffffaa",
"#ffaaaa",
"#ccccff",
"#ffffaa",
}
y += skip
fmt.Fprintf(&buf, "<text x='%d' y='%d' class='head'><tspan dx='5' dy='-0.5em'>%s</tspan></text>\n",
0, y, descs[col])
for i, bench := range perf {
val := bench.Data[col]
fill := fills[i]
barx := int(val * scale)
fmt.Fprintf(&buf, "<rect x='5' y='%d' height='%d' width='%d' fill='%s' stroke='black' />\n", y+(skip-height)/2, height, barx, fill)
labelx := 5 + barx
if labelx > 395 {
labelx = 395
}
fmt.Fprintf(&buf, "<text x='%d' y='%d' text-anchor='end'><tspan dy='-0.5em'>%.1fns</tspan></text>\n",
labelx-3, y+skip-(skip-height)/2, val)
textx := 10
if labelx < 130 {
textx = labelx + 5
}
fmt.Fprintf(&buf, "<text x='%d' y='%d'><tspan dy='-0.5em'>%s</tspan></text>\n",
textx, y+skip-(skip-height)/2, bench.Name)
y += skip
if i == 2 {
y += skip / 2
}
}
y += 5
buf.WriteString("</svg>\n")
if err := os.WriteFile(columns[col]+".svg", buf.Bytes(), 0666); err != nil {
log.Fatal(err)
}
}
func main() {
for i := range perf[0].Data {
writeSVG(i)
}
}