Skip to content

Commit

Permalink
Make the benchmarks more realistic
Browse files Browse the repository at this point in the history
  • Loading branch information
bep committed Jul 21, 2024
1 parent 2c31e1a commit 47a839a
Showing 1 changed file with 52 additions and 40 deletions.
92 changes: 52 additions & 40 deletions transpiler_test.go
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
package godartsass_test

import (
crand "crypto/rand"
"encoding/base64"
"errors"
"fmt"
"math/rand"
"os"
"path/filepath"
"strings"
Expand All @@ -14,25 +17,6 @@ import (
qt "github.com/frankban/quicktest"
)

const (
sassSample = `nav {
ul {
margin: 0;
padding: 0;
list-style: none;
}
li { display: inline-block; }
a {
display: block;
padding: 6px 12px;
text-decoration: none;
}
}`
sassSampleTranspiled = "nav ul {\n margin: 0;\n padding: 0;\n list-style: none;\n}\nnav li {\n display: inline-block;\n}\nnav a {\n display: block;\n padding: 6px 12px;\n text-decoration: none;\n}"
)

type testImportResolver struct {
name string
content string
Expand Down Expand Up @@ -329,74 +313,95 @@ div { color: $primary-color; }`, gor)

func BenchmarkTranspiler(b *testing.B) {
type tester struct {
src string
expect string
sources []string
transpiler *godartsass.Transpiler
clean func()
}

const (
sassSample = `nav {
ul {
margin: 0;
padding: 0;
list-style: none;
}
li { display: inline-block; }
a {
display: block;
padding: 6px 12px;
text-decoration: none;
}
}`
)

getSassSource := func() string {
s := sassSample

// Append some comment to make it unique.
comment := randStr(rand.Intn(1234))
s += "\n\n/*! " + comment + " */"

return s
}

newTester := func(b *testing.B, opts godartsass.Options) tester {
c := qt.New(b)
transpiler, clean := newTestTranspiler(c, godartsass.Options{})
sources := make([]string, b.N)
for i := 0; i < b.N; i++ {
sources[i] = getSassSource()
}
transpiler, clean := newTestTranspiler(c, opts)

return tester{
transpiler: transpiler,
clean: clean,
sources: sources,
}
}

runBench := func(b *testing.B, t tester) {
defer t.clean()
b.ResetTimer()
for n := 0; n < b.N; n++ {
result, err := t.transpiler.Execute(godartsass.Args{Source: t.src})
_, err := t.transpiler.Execute(godartsass.Args{Source: t.sources[n]})
if err != nil {
b.Fatal(err)
}
if result.CSS != t.expect {
b.Fatalf("Got: %q\n", result.CSS)
}

}
}

b.Run("SCSS", func(b *testing.B) {
t := newTester(b, godartsass.Options{})
t.src = sassSample
t.expect = sassSampleTranspiled
runBench(b, t)
})

// This is the obviously much slower way of doing it.
b.Run("Start and Execute", func(b *testing.B) {
for n := 0; n < b.N; n++ {
t := newTester(b, godartsass.Options{})
t.src = sassSample
t.expect = sassSampleTranspiled
result, err := t.transpiler.Execute(godartsass.Args{Source: t.src})
_, err := t.transpiler.Execute(godartsass.Args{Source: t.sources[n]})
if err != nil {
b.Fatal(err)
}
if result.CSS != t.expect {
b.Fatalf("Got: %q\n", result.CSS)
}
t.transpiler.Close()
}
})

b.Run("SCSS Parallel", func(b *testing.B) {
t := newTester(b, godartsass.Options{})
t.src = sassSample
t.expect = sassSampleTranspiled

defer t.clean()
b.RunParallel(func(pb *testing.PB) {
n := 0
for pb.Next() {
result, err := t.transpiler.Execute(godartsass.Args{Source: t.src})
_, err := t.transpiler.Execute(godartsass.Args{Source: t.sources[n]})
if err != nil {
b.Fatal(err)
}
if result.CSS != t.expect {
b.Fatalf("Got: %q\n", result.CSS)
}
n++
}
})
})
Expand Down Expand Up @@ -430,3 +435,10 @@ func getSassEmbeddedFilename() string {

return "sass"
}

func randStr(len int) string {
buff := make([]byte, len)
crand.Read(buff)
str := base64.StdEncoding.EncodeToString(buff)
return str[:len]
}

0 comments on commit 47a839a

Please sign in to comment.