Skip to content

Commit b5a2f4b

Browse files
authored
Flatten key lookup pointer loops (#312)
Reduce overhead in Parser key lookup by removing nested withUnsafeBufferPointer closures in matchKeyValue/matchKeyArray/matchKeyTable. Each matcher now opens one buffer pointer for backing storage and scans borrowed index lists with simple index-based loops and pointer advances. Behavior is unchanged; this targets instruction count in repeated table/key lookup paths.
1 parent 02d6eaf commit b5a2f4b

1 file changed

Lines changed: 24 additions & 39 deletions

File tree

Sources/TOMLDecoder/Parsing/Parser.swift

Lines changed: 24 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1905,21 +1905,16 @@ extension Parser {
19051905
guard let keyValueBase = keyValueBuffer.baseAddress else {
19061906
return nil
19071907
}
1908-
return indices.withUnsafeBufferPointer { indexBuffer in
1909-
guard let indexBase = indexBuffer.baseAddress else {
1910-
return nil
1908+
var i = 0
1909+
while i < indices.count {
1910+
let keyValueIndex = indices[i]
1911+
let keyValuePair = keyValueBase.advanced(by: keyValueIndex).pointee
1912+
if keyValuePair.keyHash == keyHash, keyValuePair.key == key {
1913+
return keyValueIndex
19111914
}
1912-
var i = 0
1913-
while i < indexBuffer.count {
1914-
let keyValueIndex = indexBase[i]
1915-
let keyValuePair = keyValueBase[keyValueIndex]
1916-
if keyValuePair.keyHash == keyHash, keyValuePair.key == key {
1917-
return keyValueIndex
1918-
}
1919-
i += 1
1920-
}
1921-
return nil
1915+
i += 1
19221916
}
1917+
return nil
19231918
}
19241919
}
19251920

@@ -1932,21 +1927,16 @@ extension Parser {
19321927
guard let keyArrayBase = keyArrayBuffer.baseAddress else {
19331928
return nil
19341929
}
1935-
return indices.withUnsafeBufferPointer { indexBuffer in
1936-
guard let indexBase = indexBuffer.baseAddress else {
1937-
return nil
1938-
}
1939-
var i = 0
1940-
while i < indexBuffer.count {
1941-
let keyArrayIndex = indexBase[i]
1942-
let keyArrayPair = keyArrayBase[keyArrayIndex]
1943-
if keyArrayPair.keyHash == keyHash, keyArrayPair.key == key {
1944-
return keyArrayIndex
1945-
}
1946-
i += 1
1930+
var i = 0
1931+
while i < indices.count {
1932+
let keyArrayIndex = indices[i]
1933+
let keyArrayPair = keyArrayBase.advanced(by: keyArrayIndex).pointee
1934+
if keyArrayPair.keyHash == keyHash, keyArrayPair.key == key {
1935+
return keyArrayIndex
19471936
}
1948-
return nil
1937+
i += 1
19491938
}
1939+
return nil
19501940
}
19511941
}
19521942

@@ -1959,21 +1949,16 @@ extension Parser {
19591949
guard let keyTableBase = keyTableBuffer.baseAddress else {
19601950
return nil
19611951
}
1962-
return indices.withUnsafeBufferPointer { indexBuffer in
1963-
guard let indexBase = indexBuffer.baseAddress else {
1964-
return nil
1965-
}
1966-
var i = 0
1967-
while i < indexBuffer.count {
1968-
let keyTableIndex = indexBase[i]
1969-
let keyTablePair = keyTableBase[keyTableIndex]
1970-
if keyTablePair.keyHash == keyHash, keyTablePair.key == key {
1971-
return keyTableIndex
1972-
}
1973-
i += 1
1952+
var i = 0
1953+
while i < indices.count {
1954+
let keyTableIndex = indices[i]
1955+
let keyTablePair = keyTableBase.advanced(by: keyTableIndex).pointee
1956+
if keyTablePair.keyHash == keyHash, keyTablePair.key == key {
1957+
return keyTableIndex
19741958
}
1975-
return nil
1959+
i += 1
19761960
}
1961+
return nil
19771962
}
19781963
}
19791964

0 commit comments

Comments
 (0)