Swift 集合基准测试

此包让您可以收集并轻松可视化关于数据结构实现和集合算法的性能数据。 它的创建旨在帮助开发 Swift 集合 包,但它在更多方面都非常有用!

该项目主要专注于 Swift 代码的基准测试,但它也可以用于运行其他语言的基准测试(尤其是分析基准测试结果)。

示例

这是一个简短的基准测试,用于衡量 Array.sorted()Set.contains(_:) 的性能

import CollectionsBenchmark

var benchmark = Benchmark(title: "Demo Benchmark")

benchmark.addSimple(
  title: "Array<Int> sorted",
  input: [Int].self
) { input in
  blackHole(input.sorted())
}

benchmark.add(
  title: "Set<Int> contains",
  input: ([Int], [Int]).self
) { input, lookups in
  let set = Set(input)
  return { timer in
    for value in lookups {
      precondition(set.contains(value))
    }
  }
}

benchmark.main()

以下是如何运行它

$ swift run -c release benchmark run results --cycles 5
Running 2 tasks on 76 sizes from 1 to 1M:
  Array<Int> sorted
  Set<Int> contains
Output file: /Users/klorentey/Projects/swift-collections-benchmark-demo/Demo/results
Appending to existing data (if any) for these tasks/sizes.

Collecting data:
  1.2.4...8...16...32...64...128...256...512...1k...2k...4k...8k...16k...32k...64k...128k...256k...512k...1M -- 5.31s
  1.2.4...8...16...32...64...128...256...512...1k...2k...4k...8k...16k...32k...64k...128k...256k...512k...1M -- 5.35s
  1.2.4...8...16...32...64...128...256...512...1k...2k...4k...8k...16k...32k...64k...128k...256k...512k...1M -- 5.29s
  1.2.4...8...16...32...64...128...256...512...1k...2k...4k...8k...16k...32k...64k...128k...256k...512k...1M -- 5.3s
  1.2.4...8...16...32...64...128...256...512...1k...2k...4k...8k...16k...32k...64k...128k...256k...512k...1M -- 5.34s
Finished in 26.6s
$ swift run -c release benchmark render results chart.png
$ open chart.png

这就是你得到的结果

chart.png

今天我了解到,对 Array 中的 20 个整数进行排序所花费的时间与查看一个包含 20 个成员的 Set 中的所有项目所花费的时间大致相同。 太有趣了! 🤓

文档

要了解此库提供的功能,请务必查看我们的 入门指南

项目状态

Swift 集合基准测试主要用作开发者工具,而不是在生产应用中使用的东西。

它公开了一个源代码级别的 API 和一个命令行界面,这两个接口在技术上都尚未稳定。 经过最初的实验阶段后,我们希望稳定这两个接口。 在此之前,新版本有时可能会带来一些更改,这些更改可能会破坏现有的基准测试定义,或者可能会以某种方式更改命令行界面,从而破坏现有的脚本。 尽管如此,即使在这个混乱的初始阶段,我们也会尽力将这种情况降到最低(或通过多版本弃用期来缓解)。

将 Swift 集合基准测试添加为依赖项

要在 SwiftPM 项目中使用此包,请将以下行添加到 Package.swift 文件中的依赖项中

.package(url: "https://github.com/apple/swift-collections-benchmark", from: "0.0.1"),

在典型情况下,你将需要设置一个专用于基准测试的独立可执行目标

// swift-tools-version:5.3
import PackageDescription

let package = Package(
  name: "MyPackage",
  products: [
    .executable(name: "my-benchmark", targets: ["MyBenchmark"]),
  ],
  dependencies: [
    .package(url: "https://github.com/apple/swift-collections-benchmark", from: "0.0.1"),
    // ... other dependencies ...
  ],
  targets: [
    // ... other targets ...
    .target(
      name: "MyBenchmark",
      dependencies: [
        .product(name: "CollectionsBenchmark", package: "swift-collections-benchmark"),
      ]),
  ]
)

为 Swift 集合基准测试做贡献

提出问题

我们可以使用 Swift 集合论坛 来提问和回答有关如何使用或处理此包的问题。 它也是讨论其发展的绝佳场所。

报告错误

如果你发现看起来像是错误的东西,请打开一个 错误报告! 尽可能详细地填写。

修复错误或进行小的改进

  1. 提交 PR 来进行更改。 如果存在你要修复的错误的 现有问题,请包含对它的引用。
  2. 确保为你要进行的任何更改添加测试覆盖率(如果可能)。

(注意:该软件包目前没有附带很多测试,这反映了它作为支持项目的起源 -- 我们努力改进这一点!)

提出小的增强

  1. 提出一个 功能请求。 讨论为什么实施它很重要。
  2. 提交带有你的实现的 PR,参与审查讨论。
  3. 当就该功能是可取的达成共识,并且该实现效果良好时,它将被合并。
  4. 欢呼!

提出更大的功能

  1. 提出一个 功能请求,或者在 论坛 上发起一个主题。 讨论为什么实施它很重要,以及潜在的实施策略。
  2. 提交带有你的实现的 PR,并参与审查讨论。 有时我们可能需要经历几次修订! 这很好 -- 它使最终结果变得更好。
  3. 当就该功能是可取的达成共识,并且该实现效果良好时,它将被合并。
  4. 庆祝!

许可

通过提交 pull request,你表示你有权将你的贡献许可给 Apple 和社区,并且通过提交补丁同意你的贡献根据 Swift 许可证 获得许可,该许可证的副本 在此存储库中提供

行为准则

与所有 Swift.org 项目一样,我们希望 Swift 集合基准测试项目能够培养一个多元化且友好的社区。 我们希望贡献者遵守 Swift.org 行为准则。 该文档的副本 在此存储库中提供

联系维护者

此软件包当前的的代码所有者是 Karoy Lorentey (@lorentey)。 你可以 在 Swift 论坛上 联系他,或者发送电子邮件至 klorentey at apple dot com。 (请保持与本项目相关。)

如果出现审核问题,你也可以直接联系 Swift 核心团队 的成员。