[Swift] Migrating benchmarks to a newer lib. (#8168)

* Adds Nativestructs pointer push into ByteBuffer

Updates benchmarks & cleanup

Adds native struct vector tests

* Address PR comments

* Add more benchmarks

* Some benchmark cleanup

* Return back to 1M structs

* Tweak Structs benchmark

* Moves swift Benchmarks folder from /tests to /benchmarks

---------

Co-authored-by: Joakim Hassila <jocke@ordo.one>
This commit is contained in:
mustiikhalil
2023-11-23 01:08:55 +01:00
committed by GitHub
parent 5a937f1ba1
commit 94ff188a3e
9 changed files with 249 additions and 119 deletions

View File

@@ -1,34 +0,0 @@
// swift-tools-version:5.1
/*
* Copyright 2020 Google Inc. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import PackageDescription
let package = Package(
name: "benchmarks",
platforms: [
.macOS(.v10_14),
],
dependencies: [
.package(path: "../../.."),
.package(url: "https://github.com/google/swift-benchmark", from: "0.1.0"),
],
targets: [
.target(
name: "benchmarks",
dependencies: ["FlatBuffers",
.product(name: "Benchmark", package: "swift-benchmark")]),
])

View File

@@ -1,102 +0,0 @@
/*
* Copyright 2023 Google Inc. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import Benchmark
import CoreFoundation
import FlatBuffers
benchmark("10Strings") {
var fb = FlatBufferBuilder(initialSize: 1<<20)
for _ in 0..<1_000_000 {
_ = fb.create(string: "foobarbaz")
}
}
benchmark("100Strings") {
var fb = FlatBufferBuilder(initialSize: 1<<20)
for _ in 0..<1_000_000 {
_ = fb.create(string: str)
}
}
benchmark("100Bytes") {
var fb = FlatBufferBuilder(initialSize: 1<<20)
for _ in 0..<1_000_000 {
_ = fb.createVector(bytes)
}
}
benchmark("100Bytes-ContiguousBytes") {
var fb = FlatBufferBuilder(initialSize: 1<<20)
for _ in 0..<1_000_000 {
_ = fb.createVector(bytes: bytes)
}
}
benchmark("FlatBufferBuilder.add") {
var fb = FlatBufferBuilder(initialSize: 1024 * 1024 * 32)
for _ in 0..<1_000_000 {
let off = fb.create(string: "T")
let s = fb.startTable(with: 4)
fb.add(element: 3.2, def: 0, at: 2)
fb.add(element: 4.2, def: 0, at: 4)
fb.add(element: 5.2, def: 0, at: 6)
fb.add(offset: off, at: 8)
_ = fb.endTable(at: s)
}
}
benchmark("structs") {
let structCount = 1_000_000
let rawSize = ((16 * 5) * structCount) / 1024
var fb = FlatBufferBuilder(initialSize: Int32(rawSize * 1600))
var offsets: [Offset] = []
for _ in 0..<structCount {
fb.startVector(
5 * MemoryLayout<AA>.size,
elementSize: MemoryLayout<AA>.alignment)
for _ in 0..<5 {
_ = fb.create(struct: AA(a: 2.4, b: 2.4))
}
let vector = fb.endVector(len: 5)
let start = fb.startTable(with: 1)
fb.add(offset: vector, at: 4)
offsets.append(Offset(offset: fb.endTable(at: start)))
}
let vector = fb.createVector(ofOffsets: offsets)
let start = fb.startTable(with: 1)
fb.add(offset: vector, at: 4)
let root = Offset(offset: fb.endTable(at: start))
fb.finish(offset: root)
}
let str = (0...99).map { _ -> String in "x" }.joined()
let bytes: [UInt8] = Array(repeating: 42, count: 100)
@usableFromInline
struct AA: NativeStruct {
public init(a: Double, b: Double) {
self.a = a
self.b = b
}
var a: Double
var b: Double
}
Benchmark.main()

View File

@@ -67,9 +67,9 @@ final class FlatBuffersNanInfTests: XCTestCase {
let data = try encoder.encode(reader)
let decoder = JSONDecoder()
decoder.nonConformingFloatDecodingStrategy = .convertFromString(
positiveInfinity: "inf",
negativeInfinity: "-inf",
nan: "nan")
positiveInfinity: "inf",
negativeInfinity: "-inf",
nan: "nan")
decoder.keyDecodingStrategy = .convertFromSnakeCase
let value = try decoder.decode(Test.self, from: data)
XCTAssertEqual(value.value, 100)

View File

@@ -53,6 +53,26 @@ final class FlatBuffersVectors: XCTestCase {
// swiftformat:enable all
}
func testCreateStructArray() {
struct Vec: NativeStruct {
let x, y, z: Float32
}
let vector: [Vec] = [
Vec(x: 1, y: 2, z: 3),
Vec(x: 4, y: 5, z: 6),
Vec(x: 7, y: 8, z: 9),
]
var b = FlatBufferBuilder(initialSize: 100)
let o = b.createVector(ofStructs: vector)
b.finish(offset: o)
vector.withUnsafeBytes { pointer in
print(Array(pointer))
}
// swiftformat:disable all
XCTAssertEqual(b.sizedByteArray, [4, 0, 0, 0, 3, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 0, 0, 128, 64, 0, 0, 160, 64, 0, 0, 192, 64, 0, 0, 224, 64, 0, 0, 0, 65, 0, 0, 16, 65])
// swiftformat:enable all
}
func testCreateEmptyIntArray() {
let numbers: [Int32] = []
var b = FlatBufferBuilder(initialSize: 20)