From 068ef83b2a746d8bab512f83098e35f436f10d48 Mon Sep 17 00:00:00 2001 From: Nate Cook Date: Fri, 19 Jun 2020 14:10:00 -0500 Subject: [PATCH 1/2] Add benchmarks for Substring.dropFirst(_:) and dropLast(_:) These are self-slicing operations, so they should be fast even for this non-random-access collection. --- benchmark/single-source/Substring.swift | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/benchmark/single-source/Substring.swift b/benchmark/single-source/Substring.swift index 7d4c7a7906459..d14c02bd7427c 100644 --- a/benchmark/single-source/Substring.swift +++ b/benchmark/single-source/Substring.swift @@ -17,6 +17,8 @@ public let SubstringTest = [ BenchmarkInfo(name: "EqualSubstringString", runFunction: run_EqualSubstringString, tags: [.validation, .api, .String]), BenchmarkInfo(name: "EqualSubstringSubstring", runFunction: run_EqualSubstringSubstring, tags: [.validation, .api, .String]), BenchmarkInfo(name: "EqualSubstringSubstringGenericEquatable", runFunction: run_EqualSubstringSubstringGenericEquatable, tags: [.validation, .api, .String]), + BenchmarkInfo(name: "SubstringDropFirst1", runFunction: run_SubstringDropFirst1, tags: [.validation, .api, .String]), + BenchmarkInfo(name: "SubstringDropLast1", runFunction: run_SubstringDropLast1, tags: [.validation, .api, .String]), BenchmarkInfo(name: "LessSubstringSubstring", runFunction: run_LessSubstringSubstring, tags: [.validation, .api, .String]), BenchmarkInfo(name: "LessSubstringSubstringGenericComparable", runFunction: run_LessSubstringSubstringGenericComparable, tags: [.validation, .api, .String]), BenchmarkInfo(name: "StringFromLongWholeSubstring", runFunction: run_StringFromLongWholeSubstring, tags: [.validation, .api, .String]), @@ -34,6 +36,8 @@ let longWide = "fὢasὢodὢijὢadὢolὢsjὢalὢsdὢjlὢasὢdfὢijὢ let (s1, ss1) = equivalentWithDistinctBuffers() let (s2, ss2) = equivalentWithDistinctBuffers() +let quiteLong = String(repeating: "0", count: 10_000) + @inline(never) public func run_SubstringFromLongString(_ N: Int) { var s = longWide @@ -126,6 +130,22 @@ public func run_EqualSubstringSubstringGenericEquatable(_ N: Int) { } } +@inline(never) +public func run_SubstringDropFirst1(_ N: Int) { + let s = quiteLong[...] + for _ in 1...N*500 { + blackHole(!s.dropFirst(1).isEmpty) + } +} + +@inline(never) +public func run_SubstringDropLast1(_ N: Int) { + let s = quiteLong[...] + for _ in 1...N*500 { + blackHole(!s.dropLast(1).isEmpty) + } +} + /* func checkEqual(_ x: T, _ y: U) where T : StringProtocol, U : StringProtocol { From 3aeead4cbf2d0e978a9809c458dfae38c551e0ab Mon Sep 17 00:00:00 2001 From: Nate Cook Date: Mon, 22 Jun 2020 01:11:44 -0500 Subject: [PATCH 2/2] Fiddle with the iteration count and length --- benchmark/single-source/Substring.swift | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/benchmark/single-source/Substring.swift b/benchmark/single-source/Substring.swift index d14c02bd7427c..fabf38bd7b7d3 100644 --- a/benchmark/single-source/Substring.swift +++ b/benchmark/single-source/Substring.swift @@ -36,7 +36,7 @@ let longWide = "fὢasὢodὢijὢadὢolὢsjὢalὢsdὢjlὢasὢdfὢijὢ let (s1, ss1) = equivalentWithDistinctBuffers() let (s2, ss2) = equivalentWithDistinctBuffers() -let quiteLong = String(repeating: "0", count: 10_000) +let quiteLong = String(repeating: "0", count: 15_000)[...] @inline(never) public func run_SubstringFromLongString(_ N: Int) { @@ -132,16 +132,16 @@ public func run_EqualSubstringSubstringGenericEquatable(_ N: Int) { @inline(never) public func run_SubstringDropFirst1(_ N: Int) { - let s = quiteLong[...] - for _ in 1...N*500 { + let s = quiteLong + for _ in 1...N*1000 { blackHole(!s.dropFirst(1).isEmpty) } } @inline(never) public func run_SubstringDropLast1(_ N: Int) { - let s = quiteLong[...] - for _ in 1...N*500 { + let s = quiteLong + for _ in 1...N*1000 { blackHole(!s.dropLast(1).isEmpty) } }