|
15 | 15 | package cue_test
|
16 | 16 |
|
17 | 17 | import (
|
| 18 | + "bytes" |
| 19 | + "fmt" |
18 | 20 | "io/fs"
|
19 | 21 | "os"
|
20 | 22 | "path/filepath"
|
21 | 23 | "testing"
|
22 | 24 |
|
| 25 | + "cuelang.org/go/cue/cuecontext" |
23 | 26 | "cuelang.org/go/internal/core/eval"
|
24 | 27 | "cuelang.org/go/internal/core/runtime"
|
25 | 28 | "cuelang.org/go/internal/cuetdtest"
|
@@ -107,3 +110,71 @@ func Benchmark(b *testing.B) {
|
107 | 110 | b.Fatal(err)
|
108 | 111 | }
|
109 | 112 | }
|
| 113 | + |
| 114 | +// TODO(mvdan): move this benchmark to internal/encoding |
| 115 | +// and cover other encodings too. |
| 116 | +// We should also cover both encoding and decoding performance. |
| 117 | +func BenchmarkLargeValueMarshalJSON(b *testing.B) { |
| 118 | + b.ReportAllocs() |
| 119 | + size := 2000 |
| 120 | + |
| 121 | + var buf bytes.Buffer |
| 122 | + |
| 123 | + fmt.Fprintf(&buf, "longString: \"") |
| 124 | + for range size { |
| 125 | + fmt.Fprintf(&buf, "x") |
| 126 | + } |
| 127 | + fmt.Fprintf(&buf, "\"\n") |
| 128 | + |
| 129 | + fmt.Fprintf(&buf, "nestedList: ") |
| 130 | + for range size { |
| 131 | + fmt.Fprintf(&buf, "[") |
| 132 | + } |
| 133 | + fmt.Fprintf(&buf, "0") |
| 134 | + for range size { |
| 135 | + fmt.Fprintf(&buf, "]") |
| 136 | + } |
| 137 | + fmt.Fprintf(&buf, "\n") |
| 138 | + |
| 139 | + fmt.Fprintf(&buf, "longList: [") |
| 140 | + for i := range size { |
| 141 | + if i > 0 { |
| 142 | + fmt.Fprintf(&buf, ",") |
| 143 | + } |
| 144 | + fmt.Fprintf(&buf, "0") |
| 145 | + } |
| 146 | + fmt.Fprintf(&buf, "]\n") |
| 147 | + |
| 148 | + fmt.Fprintf(&buf, "nestedStruct: ") |
| 149 | + for range size { |
| 150 | + fmt.Fprintf(&buf, "{k:") |
| 151 | + } |
| 152 | + fmt.Fprintf(&buf, "0") |
| 153 | + for range size { |
| 154 | + fmt.Fprintf(&buf, "}") |
| 155 | + } |
| 156 | + fmt.Fprintf(&buf, "\n") |
| 157 | + |
| 158 | + fmt.Fprintf(&buf, "longStruct: {") |
| 159 | + for i := range size { |
| 160 | + if i > 0 { |
| 161 | + fmt.Fprintf(&buf, ",") |
| 162 | + } |
| 163 | + fmt.Fprintf(&buf, "k%d: 0", i) |
| 164 | + } |
| 165 | + fmt.Fprintf(&buf, "}\n") |
| 166 | + |
| 167 | + ctx := cuecontext.New() |
| 168 | + val := ctx.CompileBytes(buf.Bytes()) |
| 169 | + if err := val.Err(); err != nil { |
| 170 | + b.Fatal(err) |
| 171 | + } |
| 172 | + b.ResetTimer() |
| 173 | + for i := 0; i < b.N; i++ { |
| 174 | + data, err := val.MarshalJSON() |
| 175 | + if err != nil { |
| 176 | + b.Fatal(err) |
| 177 | + } |
| 178 | + _ = data |
| 179 | + } |
| 180 | +} |
0 commit comments