aboutsummaryrefslogtreecommitdiff
path: root/Benchmarks/ParseBenchmarkTarget
diff options
context:
space:
mode:
authorRuben Beltran del Rio <jj@r.bdr.sh>2026-06-16 12:08:21 +0200
committerRuben Beltran del Rio <jj@r.bdr.sh>2026-06-16 12:22:47 +0200
commit501fdce29e4d2c46c4708ad7f44056878e0db3fa (patch)
treedb923b77037db9f5b37600a6e34c3bb2e8a971be /Benchmarks/ParseBenchmarkTarget
Initial extraction from Norganize1.0.0
Diffstat (limited to 'Benchmarks/ParseBenchmarkTarget')
-rw-r--r--Benchmarks/ParseBenchmarkTarget/ParseBenchmarkTarget.swift95
1 files changed, 95 insertions, 0 deletions
diff --git a/Benchmarks/ParseBenchmarkTarget/ParseBenchmarkTarget.swift b/Benchmarks/ParseBenchmarkTarget/ParseBenchmarkTarget.swift
new file mode 100644
index 0000000..91e1d38
--- /dev/null
+++ b/Benchmarks/ParseBenchmarkTarget/ParseBenchmarkTarget.swift
@@ -0,0 +1,95 @@
+import Benchmark
+import Foundation
+import NorgKit
+
+let benchmarks: @Sendable () -> Benchmark? = {
+ // Load the norg files from the Documentation directory.
+ let fileManager = FileManager.default
+ let currentDirectory = fileManager.currentDirectoryPath
+ let documentationPath = (currentDirectory as NSString).appendingPathComponent("Documentation")
+
+ let examplePath = (documentationPath as NSString).appendingPathComponent("example.norg")
+ let hugePath = (documentationPath as NSString).appendingPathComponent("huge.norg")
+
+ let exampleSource: String
+ let hugeSource: String
+
+ do {
+ exampleSource = try String(contentsOfFile: examplePath, encoding: .utf8)
+ } catch {
+ print("Current directory: \(currentDirectory)")
+ print("Failed to load example.norg from: \(examplePath)")
+ print("Error: \(error)")
+ fatalError("Failed to load example.norg")
+ }
+
+ do {
+ hugeSource = try String(contentsOfFile: hugePath, encoding: .utf8)
+ } catch {
+ print("Failed to load huge.norg from: \(hugePath)")
+ print("Error: \(error)")
+ fatalError("Failed to load huge.norg")
+ }
+
+ Benchmark.defaultConfiguration.maxDuration = .seconds(3)
+ Benchmark.defaultConfiguration.maxIterations = 500
+
+ let fileURL = URL(fileURLWithPath: "/vault/today.norg")
+
+ Benchmark("parse example") { benchmark in
+ for _ in benchmark.scaledIterations {
+ blackHole(NorgParser.parse(exampleSource))
+ }
+ }
+
+ Benchmark("parse huge") { benchmark in
+ for _ in benchmark.scaledIterations {
+ blackHole(NorgParser.parse(hugeSource))
+ }
+ }
+
+ // Same parse, plus the tree-folding pass — the delta against "parse …" above
+ // is the cost of building the hierarchy.
+ Benchmark("parse tree example") { benchmark in
+ for _ in benchmark.scaledIterations {
+ blackHole(NorgParser.parseTree(exampleSource))
+ }
+ }
+
+ Benchmark("parse tree huge") { benchmark in
+ for _ in benchmark.scaledIterations {
+ blackHole(NorgParser.parseTree(hugeSource))
+ }
+ }
+
+ // Just the fold, over an already-parsed document, to isolate its cost.
+ let hugeDocument = NorgParser.parse(hugeSource)
+ Benchmark("fold huge") { benchmark in
+ for _ in benchmark.scaledIterations {
+ blackHole(hugeDocument.tree())
+ }
+ }
+
+ // Task scanning is meant to be cheap enough to run across an entire vault, so
+ // it bypasses the full block parser.
+ Benchmark("scan tasks example") { benchmark in
+ for _ in benchmark.scaledIterations {
+ blackHole(TaskScanner.scan(content: exampleSource, fileURL: fileURL))
+ }
+ }
+
+ Benchmark("scan tasks huge") { benchmark in
+ for _ in benchmark.scaledIterations {
+ blackHole(TaskScanner.scan(content: hugeSource, fileURL: fileURL))
+ }
+ }
+
+ // Rewriting a single status marker — the write-back path for toggling a task.
+ // Line 17 (zero-based) is the first task in huge.norg, so this exercises the
+ // full split / replace / re-join path rather than bailing out early.
+ return Benchmark("update task status huge") { benchmark in
+ for _ in benchmark.scaledIterations {
+ blackHole(TaskScanner.updatedContent(hugeSource, line: 17, to: .done))
+ }
+ }
+}