Skip to content

Commit 179db4e

Browse files
auduchinokvzarytovskiidsyme
authored
IL: optimize attribute cluster reading (#13821)
* IL: optimize attribute cluster reading * Set endRid when there's a single attribute * formatter * More fixes Co-authored-by: Vlad Zarytovskii <[email protected]> Co-authored-by: Don Syme <[email protected]>
1 parent 2f471de commit 179db4e

File tree

1 file changed

+38
-13
lines changed

1 file changed

+38
-13
lines changed

src/Compiler/AbstractIL/ilread.fs

Lines changed: 38 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1220,9 +1220,12 @@ type ISeekReadIndexedRowReader<'RowT, 'KeyT, 'T when 'RowT: struct> =
12201220
abstract CompareKey: 'KeyT -> int
12211221
abstract ConvertRow: byref<'RowT> -> 'T
12221222

1223-
let seekReadIndexedRowsByInterface numRows binaryChop (reader: ISeekReadIndexedRowReader<'RowT, _, _>) =
1223+
let seekReadIndexedRowsRange numRows binaryChop (reader: ISeekReadIndexedRowReader<'RowT, _, _>) =
12241224
let mutable row = Unchecked.defaultof<'RowT>
12251225

1226+
let mutable startRid = -1
1227+
let mutable endRid = -1
1228+
12261229
if binaryChop then
12271230
let mutable low = 0
12281231
let mutable high = numRows + 1
@@ -1241,12 +1244,12 @@ let seekReadIndexedRowsByInterface numRows binaryChop (reader: ISeekReadIndexedR
12411244
elif c < 0 then high <- mid
12421245
else fin <- true
12431246

1244-
let res = ImmutableArray.CreateBuilder()
1245-
12461247
if high - low > 1 then
12471248
// now read off rows, forward and backwards
12481249
let mid = (low + high) / 2
12491250

1251+
startRid <- mid
1252+
12501253
// read backwards
12511254
let mutable fin = false
12521255
let mutable curr = mid - 1
@@ -1258,14 +1261,12 @@ let seekReadIndexedRowsByInterface numRows binaryChop (reader: ISeekReadIndexedR
12581261
reader.GetRow(curr, &row)
12591262

12601263
if reader.CompareKey(reader.GetKey(&row)) = 0 then
1261-
res.Add(reader.ConvertRow(&row))
1264+
startRid <- curr
12621265
else
12631266
fin <- true
12641267

12651268
curr <- curr - 1
12661269

1267-
res.Reverse()
1268-
12691270
// read forward
12701271
let mutable fin = false
12711272
let mutable curr = mid
@@ -1277,23 +1278,47 @@ let seekReadIndexedRowsByInterface numRows binaryChop (reader: ISeekReadIndexedR
12771278
reader.GetRow(curr, &row)
12781279

12791280
if reader.CompareKey(reader.GetKey(&row)) = 0 then
1280-
res.Add(reader.ConvertRow(&row))
1281+
endRid <- curr
12811282
else
12821283
fin <- true
12831284

12841285
curr <- curr + 1
12851286

1286-
res.ToArray()
12871287
else
1288-
let res = ImmutableArray.CreateBuilder()
1288+
let mutable rid = 1
12891289

1290-
for i = 1 to numRows do
1291-
reader.GetRow(i, &row)
1290+
while rid <= numRows && startRid = -1 do
1291+
reader.GetRow(rid, &row)
12921292

12931293
if reader.CompareKey(reader.GetKey(&row)) = 0 then
1294-
res.Add(reader.ConvertRow(&row))
1294+
startRid <- rid
1295+
endRid <- rid
1296+
1297+
rid <- rid + 1
1298+
1299+
let mutable fin = false
1300+
1301+
while rid <= numRows && not fin do
1302+
reader.GetRow(rid, &row)
1303+
1304+
if reader.CompareKey(reader.GetKey(&row)) = 0 then
1305+
endRid <- rid
1306+
else
1307+
fin <- true
1308+
1309+
startRid, endRid
1310+
1311+
let seekReadIndexedRowsByInterface numRows binaryChop (reader: ISeekReadIndexedRowReader<'RowT, _, _>) =
1312+
let startRid, endRid = seekReadIndexedRowsRange numRows binaryChop reader
1313+
1314+
if startRid <= 0 || endRid < startRid then
1315+
[||]
1316+
else
12951317

1296-
res.ToArray()
1318+
Array.init (endRid - startRid + 1) (fun i ->
1319+
let mutable row = Unchecked.defaultof<'RowT>
1320+
reader.GetRow(startRid + i, &row)
1321+
reader.ConvertRow(&row))
12971322

12981323
[<Struct>]
12991324
type CustomAttributeRow =

0 commit comments

Comments
 (0)