Skip to content

Commit ece1bfc

Browse files
authored
Merge pull request #20886 from Catfish-Man/someone-called-json-is-decoding-things
2 parents 74a3e8a + c129066 commit ece1bfc

File tree

3 files changed

+91
-0
lines changed

3 files changed

+91
-0
lines changed

benchmark/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ set(SWIFT_BENCH_MODULES
9494
single-source/InsertCharacter
9595
single-source/Integrate
9696
single-source/IterateData
97+
single-source/JSON
9798
single-source/Join
9899
single-source/LazyFilter
99100
single-source/LinkedList

benchmark/single-source/JSON.swift

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
//===--- JSON.swift -------------------------------------------------------===//
2+
//
3+
// This source file is part of the Swift.org open source project
4+
//
5+
// Copyright (c) 2018 Apple Inc. and the Swift project authors
6+
// Licensed under Apache License v2.0 with Runtime Library Exception
7+
//
8+
// See https://swift.org/LICENSE.txt for license information
9+
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
10+
//
11+
//===----------------------------------------------------------------------===//
12+
13+
import TestsUtils
14+
import Foundation
15+
16+
public let JSON = [
17+
BenchmarkInfo(name: "JSONPerfEncode", runFunction: run_JSONPerfEncode, tags: [.validation, .bridging], setUpFunction: setup_coder),
18+
BenchmarkInfo(name: "JSONPerfDecode", runFunction: run_JSONPerfDecode, tags: [.validation, .bridging], setUpFunction: setup_coder),
19+
]
20+
21+
22+
struct Tove: Codable {
23+
var slithy: Bool = true
24+
var gyreInRadians: Double = 0.3
25+
}
26+
27+
struct Borogove : Codable {
28+
var mimsyness: Int = Int.max
29+
}
30+
31+
struct Wabe : Codable {
32+
var toves: [Tove]
33+
var borogoves: [Borogove]?
34+
static var canonical: Wabe {
35+
return Wabe(toves: [Tove(), Tove(), Tove(), Tove(),
36+
Tove(slithy: false, gyreInRadians: 1.8)],
37+
borogoves: [Borogove(mimsyness: 18), Borogove(mimsyness: 74),
38+
Borogove(), Borogove()])
39+
}
40+
}
41+
42+
struct Beast : Codable {
43+
var name: String
44+
}
45+
46+
47+
struct Jabberwocky : Codable {
48+
var time = "brillig"
49+
var wabe = Wabe.canonical
50+
var beware: [Beast] = [ Beast(name: "Jabberwock"), Beast(name: "Bandersnatch"), Beast(name: "Jubjub Bird")]
51+
var swordType = "vörpal"
52+
}
53+
54+
struct JSONPerfTester {
55+
var poems = Array(repeating: Jabberwocky(), count: 6)
56+
var encoder: JSONEncoder = JSONEncoder()
57+
var decoder: JSONDecoder = JSONDecoder()
58+
var data: Data! = nil
59+
60+
init() {
61+
data = try! encoder.encode(Array(poems.prefix(3)))
62+
//pre-warm everything to try to reduce variance
63+
let _ = try! encoder.encode(poems)
64+
let _ = try! decoder.decode(Array<Jabberwocky>.self,
65+
from: data)
66+
}
67+
}
68+
69+
var tester: JSONPerfTester! = nil
70+
71+
public func setup_coder() {
72+
tester = JSONPerfTester()
73+
}
74+
75+
@inline(never)
76+
public func run_JSONPerfEncode(_ N: Int) {
77+
for _ in 0 ..< N {
78+
let _ = try! tester.encoder.encode(tester.poems)
79+
}
80+
}
81+
82+
@inline(never)
83+
public func run_JSONPerfDecode(_ N: Int) {
84+
for _ in 0 ..< N {
85+
let _ = try! tester.decoder.decode(Array<Jabberwocky>.self,
86+
from: tester.data)
87+
}
88+
}

benchmark/utils/main.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ import Histogram
8282
import InsertCharacter
8383
import Integrate
8484
import IterateData
85+
import JSON
8586
import Join
8687
import LazyFilter
8788
import LinkedList
@@ -254,6 +255,7 @@ registerBenchmark(Histogram)
254255
registerBenchmark(InsertCharacter)
255256
registerBenchmark(IntegrateTest)
256257
registerBenchmark(IterateData)
258+
registerBenchmark(JSON)
257259
registerBenchmark(Join)
258260
registerBenchmark(LazyFilter)
259261
registerBenchmark(LinkedList)

0 commit comments

Comments
 (0)