Skip to content

Instantly share code, notes, and snippets.

@staciax
Last active April 17, 2026 07:37
Show Gist options
  • Select an option

  • Save staciax/967b6c3314c5e0764d4fcf513a3015f7 to your computer and use it in GitHub Desktop.

Select an option

Save staciax/967b6c3314c5e0764d4fcf513a3015f7 to your computer and use it in GitHub Desktop.
swift-split-benchmark
import Benchmark
import Foundation
let desc = "a.b.c.d.e.f.g.h"
let benchmarks: @Sendable () -> Void = {
Benchmark("components-separatedBy") { benchmark in
for _ in benchmark.scaledIterations {
blackHole(desc.components(separatedBy: ".").last ?? desc)
}
}
Benchmark("split-separator") { benchmark in
for _ in benchmark.scaledIterations {
blackHole(desc.split(separator: ".").last.map(String.init) ?? desc)
}
}
Benchmark("lastIndex") { benchmark in
for _ in benchmark.scaledIterations {
blackHole(
desc.lastIndex(of: ".").map {
String(desc[desc.index(after: $0)...])
} ?? desc)
}
}
}
scarlet $ swift package benchmark --target SplitBenchmarkTarget
Building for debugging...
ld: warning: building for macOS-13.0, but linking with dylib '/opt/homebrew/opt/jemalloc/lib/libjemalloc.2.dylib' which was built for newer version 15.0
[5/5] Applying BenchmarkTool-tool
Build of product 'BenchmarkTool' complete! (3.87s)
Build complete!
Building BenchmarkTool in release mode...
Building benchmark targets in release mode for benchmark run...
Building SplitBenchmarkTarget
==================
Running Benchmarks
==================
0% [ ] ETA: 00:00:00 | SplitBenchmarkTarget:comp 1% [ ] ETA: 00:00:01 | SplitBenchmarkTarget:comp 5% [--- ] ETA: 00:00:01 | SplitBenchmarkTarget:comp 10% [------ ] ETA: 00:00:01 | SplitBenchmarkTarget:comp 20% [------------ ] ETA: 00:00:01 | SplitBenchmarkTarget:comp 30% [------------------ ] ETA: 00:00:01 | SplitBenchmarkTarget:comp 40% [------------------------ ] ETA: 00:00:01 | SplitBenchmarkTarget:comp 45% [--------------------------- ] ETA: 00:00:01 | SplitBenchmarkTarget:comp 50% [------------------------------ ] ETA: 00:00:01 | SplitBenchmarkTarget:comp 60% [------------------------------------ ] ETA: 00:00:01 | SplitBenchmarkTarget:comp 70% [------------------------------------------ ] ETA: 00:00:01 | SplitBenchmarkTarget:comp 80% [------------------------------------------------ ] ETA: 00:00:01 | SplitBenchmarkTarget:comp 90% [------------------------------------------------------ ] ETA: 00:00:01 | SplitBenchmarkTarget:comp100% [------------------------------------------------------------] ETA: 00:00:00 | SplitBenchmarkTarget:comp100% [------------------------------------------------------------] ETA: 00:00:00 | SplitBenchmarkTarget:components-separatedBy
0% [ ] ETA: 00:00:00 | SplitBenchmarkTarget:last 1% [ ] ETA: 00:00:01 | SplitBenchmarkTarget:last 6% [--- ] ETA: 00:00:01 | SplitBenchmarkTarget:last 15% [--------- ] ETA: 00:00:01 | SplitBenchmarkTarget:last 25% [--------------- ] ETA: 00:00:01 | SplitBenchmarkTarget:last 35% [--------------------- ] ETA: 00:00:01 | SplitBenchmarkTarget:last 45% [--------------------------- ] ETA: 00:00:01 | SplitBenchmarkTarget:last 55% [--------------------------------- ] ETA: 00:00:01 | SplitBenchmarkTarget:last 65% [--------------------------------------- ] ETA: 00:00:01 | SplitBenchmarkTarget:last 75% [--------------------------------------------- ] ETA: 00:00:01 | SplitBenchmarkTarget:last 85% [--------------------------------------------------- ] ETA: 00:00:01 | SplitBenchmarkTarget:last 90% [------------------------------------------------------ ] ETA: 00:00:01 | SplitBenchmarkTarget:last 95% [--------------------------------------------------------- ] ETA: 00:00:01 | SplitBenchmarkTarget:last100% [------------------------------------------------------------] ETA: 00:00:00 | SplitBenchmarkTarget:last100% [------------------------------------------------------------] ETA: 00:00:00 | SplitBenchmarkTarget:lastIndex
0% [ ] ETA: 00:00:00 | SplitBenchmarkTarget:spli 1% [ ] ETA: 00:00:01 | SplitBenchmarkTarget:spli 6% [--- ] ETA: 00:00:01 | SplitBenchmarkTarget:spli 15% [--------- ] ETA: 00:00:01 | SplitBenchmarkTarget:spli 25% [--------------- ] ETA: 00:00:01 | SplitBenchmarkTarget:spli 35% [--------------------- ] ETA: 00:00:01 | SplitBenchmarkTarget:spli 40% [------------------------ ] ETA: 00:00:01 | SplitBenchmarkTarget:spli 50% [------------------------------ ] ETA: 00:00:01 | SplitBenchmarkTarget:spli 60% [------------------------------------ ] ETA: 00:00:01 | SplitBenchmarkTarget:spli 70% [------------------------------------------ ] ETA: 00:00:01 | SplitBenchmarkTarget:spli 80% [------------------------------------------------ ] ETA: 00:00:01 | SplitBenchmarkTarget:spli 90% [------------------------------------------------------ ] ETA: 00:00:01 | SplitBenchmarkTarget:spli100% [------------------------------------------------------------] ETA: 00:00:00 | SplitBenchmarkTarget:spli100% [------------------------------------------------------------] ETA: 00:00:00 | SplitBenchmarkTarget:split-separator
=============================================================================================================
Baseline 'Current_run'
=============================================================================================================
Host 'STACIAs-MacBook-Air.local' with 8 'arm64' processors with 16 GB memory, running:
Darwin Kernel Version 24.6.0: Fri Feb 27 19:34:52 PST 2026; root:xnu-11417.140.69.709.8~1/RELEASE_ARM64_T8122
====================
SplitBenchmarkTarget
====================
components-separatedBy
╒═══════════════════════════════╤═══════════╤═══════════╤═══════════╤═══════════╤═══════════╤═══════════╤═══════════╤═══════════╕
│ Metric │ p0 │ p25 │ p50 │ p75 │ p90 │ p99 │ p100 │ Samples │
╞═══════════════════════════════╪═══════════╪═══════════╪═══════════╪═══════════╪═══════════╪═══════════╪═══════════╪═══════════╡
│ Instructions (K) * │ 34 │ 34 │ 34 │ 34 │ 34 │ 34 │ 60 │ 10000 │
├───────────────────────────────┼───────────┼───────────┼───────────┼───────────┼───────────┼───────────┼───────────┼───────────┤
│ Malloc (total) * │ 4 │ 4 │ 4 │ 4 │ 4 │ 4 │ 4 │ 10000 │
├───────────────────────────────┼───────────┼───────────┼───────────┼───────────┼───────────┼───────────┼───────────┼───────────┤
│ Memory (resident peak) (K) │ 7930 │ 8262 │ 8278 │ 8294 │ 8307 │ 8307 │ 8307 │ 10000 │
├───────────────────────────────┼───────────┼───────────┼───────────┼───────────┼───────────┼───────────┼───────────┼───────────┤
│ Throughput (# / s) (K) │ 220 │ 212 │ 207 │ 155 │ 133 │ 91 │ 3 │ 10000 │
├───────────────────────────────┼───────────┼───────────┼───────────┼───────────┼───────────┼───────────┼───────────┼───────────┤
│ Time (total CPU) (ns) * │ 6833 │ 7043 │ 7211 │ 9631 │ 11295 │ 17759 │ 97125 │ 10000 │
├───────────────────────────────┼───────────┼───────────┼───────────┼───────────┼───────────┼───────────┼───────────┼───────────┤
│ Time (wall clock) (ns) * │ 4541 │ 4711 │ 4835 │ 6459 │ 7543 │ 11007 │ 356917 │ 10000 │
╘═══════════════════════════════╧═══════════╧═══════════╧═══════════╧═══════════╧═══════════╧═══════════╧═══════════╧═══════════╛
lastIndex
╒═══════════════════════════════╤═══════════╤═══════════╤═══════════╤═══════════╤═══════════╤═══════════╤═══════════╤═══════════╕
│ Metric │ p0 │ p25 │ p50 │ p75 │ p90 │ p99 │ p100 │ Samples │
╞═══════════════════════════════╪═══════════╪═══════════╪═══════════╪═══════════╪═══════════╪═══════════╪═══════════╪═══════════╡
│ Instructions * │ 1819 │ 1822 │ 1822 │ 1822 │ 1822 │ 1822 │ 18115 │ 10000 │
├───────────────────────────────┼───────────┼───────────┼───────────┼───────────┼───────────┼───────────┼───────────┼───────────┤
│ Malloc (total) * │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ 10000 │
├───────────────────────────────┼───────────┼───────────┼───────────┼───────────┼───────────┼───────────┼───────────┼───────────┤
│ Memory (resident peak) (K) │ 7946 │ 8278 │ 8294 │ 8311 │ 8323 │ 8323 │ 8323 │ 10000 │
├───────────────────────────────┼───────────┼───────────┼───────────┼───────────┼───────────┼───────────┼───────────┼───────────┤
│ Throughput (# / s) (K) │ 1092 │ 1000 │ 961 │ 857 │ 827 │ 649 │ 65 │ 10000 │
├───────────────────────────────┼───────────┼───────────┼───────────┼───────────┼───────────┼───────────┼───────────┼───────────┤
│ Time (total CPU) (ns) * │ 3999 │ 4127 │ 4211 │ 4835 │ 4959 │ 7791 │ 63124 │ 10000 │
├───────────────────────────────┼───────────┼───────────┼───────────┼───────────┼───────────┼───────────┼───────────┼───────────┤
│ Time (wall clock) (ns) * │ 916 │ 1000 │ 1041 │ 1167 │ 1209 │ 1500 │ 15500 │ 10000 │
╘═══════════════════════════════╧═══════════╧═══════════╧═══════════╧═══════════╧═══════════╧═══════════╧═══════════╧═══════════╛
split-separator
╒═══════════════════════════════╤═══════════╤═══════════╤═══════════╤═══════════╤═══════════╤═══════════╤═══════════╤═══════════╕
│ Metric │ p0 │ p25 │ p50 │ p75 │ p90 │ p99 │ p100 │ Samples │
╞═══════════════════════════════╪═══════════╪═══════════╪═══════════╪═══════════╪═══════════╪═══════════╪═══════════╪═══════════╡
│ Instructions (K) * │ 25 │ 25 │ 25 │ 25 │ 25 │ 26 │ 64 │ 10000 │
├───────────────────────────────┼───────────┼───────────┼───────────┼───────────┼───────────┼───────────┼───────────┼───────────┤
│ Malloc (total) * │ 4 │ 4 │ 4 │ 4 │ 4 │ 4 │ 4 │ 10000 │
├───────────────────────────────┼───────────┼───────────┼───────────┼───────────┼───────────┼───────────┼───────────┼───────────┤
│ Memory (resident peak) (K) │ 7913 │ 8245 │ 8245 │ 8278 │ 8290 │ 8290 │ 8290 │ 10000 │
├───────────────────────────────┼───────────┼───────────┼───────────┼───────────┼───────────┼───────────┼───────────┼───────────┤
│ Throughput (# / s) (K) │ 218 │ 179 │ 155 │ 153 │ 151 │ 87 │ 10 │ 10000 │
├───────────────────────────────┼───────────┼───────────┼───────────┼───────────┼───────────┼───────────┼───────────┼───────────┤
│ Time (total CPU) (ns) * │ 7166 │ 8711 │ 10047 │ 10215 │ 10423 │ 20095 │ 74125 │ 10000 │
├───────────────────────────────┼───────────┼───────────┼───────────┼───────────┼───────────┼───────────┼───────────┼───────────┤
│ Time (wall clock) (ns) * │ 4583 │ 5583 │ 6459 │ 6543 │ 6627 │ 11463 │ 100167 │ 10000 │
╘═══════════════════════════════╧═══════════╧═══════════╧═══════════╧═══════════╧═══════════╧═══════════╧═══════════╧═══════════╛
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment