Skip to content

Commit acd147b

Browse files
DedSec256auduchinokvzarytovskii
authored
IL: optimize attribute cluster reading (Fixed version) (#15941)
* IL: optimize attribute cluster reading * Set endRid when there's a single attribute * formatter * More fixes * fix --------- Co-authored-by: Eugene Auduchinok <[email protected]> Co-authored-by: Vlad Zarytovskii <[email protected]>
1 parent 7e9f9ad commit acd147b

File tree

1 file changed

+42
-14
lines changed

1 file changed

+42
-14
lines changed

src/Compiler/AbstractIL/ilread.fs

Lines changed: 42 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1201,9 +1201,12 @@ type ISeekReadIndexedRowReader<'RowT, 'KeyT, 'T when 'RowT: struct> =
12011201
abstract CompareKey: 'KeyT -> int
12021202
abstract ConvertRow: byref<'RowT> -> 'T
12031203

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

1207+
let mutable startRid = -1
1208+
let mutable endRid = -1
1209+
12071210
if binaryChop then
12081211
let mutable low = 0
12091212
let mutable high = numRows + 1
@@ -1222,12 +1225,13 @@ let seekReadIndexedRowsByInterface numRows binaryChop (reader: ISeekReadIndexedR
12221225
elif c < 0 then high <- mid
12231226
else fin <- true
12241227

1225-
let res = ImmutableArray.CreateBuilder()
1226-
12271228
if high - low > 1 then
12281229
// now read off rows, forward and backwards
12291230
let mid = (low + high) / 2
12301231

1232+
startRid <- mid
1233+
endRid <- mid
1234+
12311235
// read backwards
12321236
let mutable fin = false
12331237
let mutable curr = mid - 1
@@ -1239,17 +1243,15 @@ let seekReadIndexedRowsByInterface numRows binaryChop (reader: ISeekReadIndexedR
12391243
reader.GetRow(curr, &row)
12401244

12411245
if reader.CompareKey(reader.GetKey(&row)) = 0 then
1242-
res.Add(reader.ConvertRow(&row))
1246+
startRid <- curr
12431247
else
12441248
fin <- true
12451249

12461250
curr <- curr - 1
12471251

1248-
res.Reverse()
1249-
12501252
// read forward
12511253
let mutable fin = false
1252-
let mutable curr = mid
1254+
let mutable curr = mid + 1
12531255

12541256
while not fin do
12551257
if curr > numRows then
@@ -1258,23 +1260,49 @@ let seekReadIndexedRowsByInterface numRows binaryChop (reader: ISeekReadIndexedR
12581260
reader.GetRow(curr, &row)
12591261

12601262
if reader.CompareKey(reader.GetKey(&row)) = 0 then
1261-
res.Add(reader.ConvertRow(&row))
1263+
endRid <- curr
12621264
else
12631265
fin <- true
12641266

12651267
curr <- curr + 1
12661268

1267-
res.ToArray()
12681269
else
1269-
let res = ImmutableArray.CreateBuilder()
1270+
let mutable rid = 1
12701271

1271-
for i = 1 to numRows do
1272-
reader.GetRow(i, &row)
1272+
while rid <= numRows && startRid = -1 do
1273+
reader.GetRow(rid, &row)
12731274

12741275
if reader.CompareKey(reader.GetKey(&row)) = 0 then
1275-
res.Add(reader.ConvertRow(&row))
1276+
startRid <- rid
1277+
endRid <- rid
1278+
1279+
rid <- rid + 1
1280+
1281+
let mutable fin = false
1282+
1283+
while rid <= numRows && not fin do
1284+
reader.GetRow(rid, &row)
1285+
1286+
if reader.CompareKey(reader.GetKey(&row)) = 0 then
1287+
endRid <- rid
1288+
else
1289+
fin <- true
1290+
1291+
rid <- rid + 1
1292+
1293+
startRid, endRid
1294+
1295+
let seekReadIndexedRowsByInterface numRows binaryChop (reader: ISeekReadIndexedRowReader<'RowT, _, _>) =
1296+
let startRid, endRid = seekReadIndexedRowsRange numRows binaryChop reader
1297+
1298+
if startRid <= 0 || endRid < startRid then
1299+
[||]
1300+
else
12761301

1277-
res.ToArray()
1302+
Array.init (endRid - startRid + 1) (fun i ->
1303+
let mutable row = Unchecked.defaultof<'RowT>
1304+
reader.GetRow(startRid + i, &row)
1305+
reader.ConvertRow(&row))
12781306

12791307
[<Struct>]
12801308
type CustomAttributeRow =

0 commit comments

Comments
 (0)