From 59e4658320ccbb7bd852b2d76e0720938239f4ff Mon Sep 17 00:00:00 2001 From: Eugene Auduchinok Date: Thu, 1 Sep 2022 12:05:32 +0200 Subject: [PATCH 1/5] IL: optimize attribute cluster reading --- src/Compiler/AbstractIL/ilread.fs | 45 ++++++++++++++++++++----------- 1 file changed, 29 insertions(+), 16 deletions(-) diff --git a/src/Compiler/AbstractIL/ilread.fs b/src/Compiler/AbstractIL/ilread.fs index 10189157adf..7051a07b225 100644 --- a/src/Compiler/AbstractIL/ilread.fs +++ b/src/Compiler/AbstractIL/ilread.fs @@ -1201,9 +1201,12 @@ type ISeekReadIndexedRowReader<'RowT, 'KeyT, 'T when 'RowT: struct> = abstract CompareKey: 'KeyT -> int abstract ConvertRow: byref<'RowT> -> 'T -let seekReadIndexedRowsByInterface numRows binaryChop (reader: ISeekReadIndexedRowReader<'RowT, _, _>) = +let seekReadIndexedRowsRange numRows binaryChop (reader: ISeekReadIndexedRowReader<'RowT, _, _>) : int * int = let mutable row = Unchecked.defaultof<'RowT> + let mutable startRid = -1 + let mutable endRid = -1 + if binaryChop then let mutable low = 0 let mutable high = numRows + 1 @@ -1222,8 +1225,6 @@ let seekReadIndexedRowsByInterface numRows binaryChop (reader: ISeekReadIndexedR elif c < 0 then high <- mid else fin <- true - let res = ImmutableArray.CreateBuilder() - if high - low > 1 then // now read off rows, forward and backwards let mid = (low + high) / 2 @@ -1237,16 +1238,13 @@ let seekReadIndexedRowsByInterface numRows binaryChop (reader: ISeekReadIndexedR fin <- true else reader.GetRow(curr, &row) - if reader.CompareKey(reader.GetKey(&row)) = 0 then - res.Add(reader.ConvertRow(&row)) + startRid <- curr else fin <- true curr <- curr - 1 - res.Reverse() - // read forward let mutable fin = false let mutable curr = mid @@ -1256,25 +1254,40 @@ let seekReadIndexedRowsByInterface numRows binaryChop (reader: ISeekReadIndexedR fin <- true else reader.GetRow(curr, &row) - if reader.CompareKey(reader.GetKey(&row)) = 0 then - res.Add(reader.ConvertRow(&row)) + endRid <- curr else fin <- true curr <- curr + 1 - res.ToArray() else - let res = ImmutableArray.CreateBuilder() - - for i = 1 to numRows do - reader.GetRow(i, &row) + let mutable rid = 1 + while rid <= numRows && startRid = -1 do + reader.GetRow(rid, &row) + if reader.CompareKey(reader.GetKey(&row)) = 0 then + startRid <- rid + endRid <- rid + rid <- rid + 1 + let mutable fin = false + while not fin do + reader.GetRow(rid, &row) if reader.CompareKey(reader.GetKey(&row)) = 0 then - res.Add(reader.ConvertRow(&row)) + endRid <- rid + else + fin <- true + + startRid, endRid + +let seekReadIndexedRowsByInterface numRows binaryChop (reader: ISeekReadIndexedRowReader<'RowT, _, _>) = + let startRid, endRid = seekReadIndexedRowsRange numRows binaryChop reader + if startRid < 0 || endRid < startRid then [||] else - res.ToArray() + Array.init (endRid - startRid + 1) (fun i -> + let mutable row = Unchecked.defaultof<'RowT> + reader.GetRow(startRid + i, &row) + reader.ConvertRow(&row)) [] type CustomAttributeRow = From 56428869eab69c150b2406c9532bd8dccc19e003 Mon Sep 17 00:00:00 2001 From: Eugene Auduchinok Date: Mon, 12 Sep 2022 12:12:42 +0200 Subject: [PATCH 2/5] Set endRid when there's a single attribute --- src/Compiler/AbstractIL/ilread.fs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Compiler/AbstractIL/ilread.fs b/src/Compiler/AbstractIL/ilread.fs index 7051a07b225..4fd08dfc2e8 100644 --- a/src/Compiler/AbstractIL/ilread.fs +++ b/src/Compiler/AbstractIL/ilread.fs @@ -1201,7 +1201,7 @@ type ISeekReadIndexedRowReader<'RowT, 'KeyT, 'T when 'RowT: struct> = abstract CompareKey: 'KeyT -> int abstract ConvertRow: byref<'RowT> -> 'T -let seekReadIndexedRowsRange numRows binaryChop (reader: ISeekReadIndexedRowReader<'RowT, _, _>) : int * int = +let seekReadIndexedRowsRange numRows binaryChop (reader: ISeekReadIndexedRowReader<'RowT, _, _>) = let mutable row = Unchecked.defaultof<'RowT> let mutable startRid = -1 @@ -1245,6 +1245,8 @@ let seekReadIndexedRowsRange numRows binaryChop (reader: ISeekReadIndexedRowRead curr <- curr - 1 + endRid <- mid + // read forward let mutable fin = false let mutable curr = mid From 04534f90e56f3708b45ab8c51cef33d99433c834 Mon Sep 17 00:00:00 2001 From: Eugene Auduchinok Date: Mon, 12 Sep 2022 12:21:41 +0200 Subject: [PATCH 3/5] formatter --- src/Compiler/AbstractIL/ilread.fs | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/Compiler/AbstractIL/ilread.fs b/src/Compiler/AbstractIL/ilread.fs index 4fd08dfc2e8..c9b96d942c3 100644 --- a/src/Compiler/AbstractIL/ilread.fs +++ b/src/Compiler/AbstractIL/ilread.fs @@ -1238,6 +1238,7 @@ let seekReadIndexedRowsRange numRows binaryChop (reader: ISeekReadIndexedRowRead fin <- true else reader.GetRow(curr, &row) + if reader.CompareKey(reader.GetKey(&row)) = 0 then startRid <- curr else @@ -1256,6 +1257,7 @@ let seekReadIndexedRowsRange numRows binaryChop (reader: ISeekReadIndexedRowRead fin <- true else reader.GetRow(curr, &row) + if reader.CompareKey(reader.GetKey(&row)) = 0 then endRid <- curr else @@ -1265,16 +1267,21 @@ let seekReadIndexedRowsRange numRows binaryChop (reader: ISeekReadIndexedRowRead else let mutable rid = 1 + while rid <= numRows && startRid = -1 do reader.GetRow(rid, &row) + if reader.CompareKey(reader.GetKey(&row)) = 0 then startRid <- rid endRid <- rid + rid <- rid + 1 let mutable fin = false + while not fin do reader.GetRow(rid, &row) + if reader.CompareKey(reader.GetKey(&row)) = 0 then endRid <- rid else @@ -1284,12 +1291,15 @@ let seekReadIndexedRowsRange numRows binaryChop (reader: ISeekReadIndexedRowRead let seekReadIndexedRowsByInterface numRows binaryChop (reader: ISeekReadIndexedRowReader<'RowT, _, _>) = let startRid, endRid = seekReadIndexedRowsRange numRows binaryChop reader - if startRid < 0 || endRid < startRid then [||] else - Array.init (endRid - startRid + 1) (fun i -> - let mutable row = Unchecked.defaultof<'RowT> - reader.GetRow(startRid + i, &row) - reader.ConvertRow(&row)) + if startRid < 0 || endRid < startRid then + [||] + else + + Array.init (endRid - startRid + 1) (fun i -> + let mutable row = Unchecked.defaultof<'RowT> + reader.GetRow(startRid + i, &row) + reader.ConvertRow(&row)) [] type CustomAttributeRow = From 9b14288e9833866d4e92ee41235686e96022cf13 Mon Sep 17 00:00:00 2001 From: Eugene Auduchinok Date: Mon, 12 Sep 2022 13:10:21 +0200 Subject: [PATCH 4/5] More fixes --- src/Compiler/AbstractIL/ilread.fs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Compiler/AbstractIL/ilread.fs b/src/Compiler/AbstractIL/ilread.fs index c9b96d942c3..1f56a5a5ede 100644 --- a/src/Compiler/AbstractIL/ilread.fs +++ b/src/Compiler/AbstractIL/ilread.fs @@ -1229,6 +1229,8 @@ let seekReadIndexedRowsRange numRows binaryChop (reader: ISeekReadIndexedRowRead // now read off rows, forward and backwards let mid = (low + high) / 2 + startRid <- mid + // read backwards let mutable fin = false let mutable curr = mid - 1 @@ -1246,8 +1248,6 @@ let seekReadIndexedRowsRange numRows binaryChop (reader: ISeekReadIndexedRowRead curr <- curr - 1 - endRid <- mid - // read forward let mutable fin = false let mutable curr = mid @@ -1279,7 +1279,7 @@ let seekReadIndexedRowsRange numRows binaryChop (reader: ISeekReadIndexedRowRead let mutable fin = false - while not fin do + while rid <= numRows && not fin do reader.GetRow(rid, &row) if reader.CompareKey(reader.GetKey(&row)) = 0 then @@ -1292,7 +1292,7 @@ let seekReadIndexedRowsRange numRows binaryChop (reader: ISeekReadIndexedRowRead let seekReadIndexedRowsByInterface numRows binaryChop (reader: ISeekReadIndexedRowReader<'RowT, _, _>) = let startRid, endRid = seekReadIndexedRowsRange numRows binaryChop reader - if startRid < 0 || endRid < startRid then + if startRid <= 0 || endRid < startRid then [||] else From 1e0ebe5eb08f59227b8d990f0598b36b5502ccb1 Mon Sep 17 00:00:00 2001 From: Alex Berezhnykh Date: Wed, 6 Sep 2023 18:28:29 +0300 Subject: [PATCH 5/5] fix --- src/Compiler/AbstractIL/ilread.fs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Compiler/AbstractIL/ilread.fs b/src/Compiler/AbstractIL/ilread.fs index 1f56a5a5ede..d872cc421e3 100644 --- a/src/Compiler/AbstractIL/ilread.fs +++ b/src/Compiler/AbstractIL/ilread.fs @@ -1230,6 +1230,7 @@ let seekReadIndexedRowsRange numRows binaryChop (reader: ISeekReadIndexedRowRead let mid = (low + high) / 2 startRid <- mid + endRid <- mid // read backwards let mutable fin = false @@ -1250,7 +1251,7 @@ let seekReadIndexedRowsRange numRows binaryChop (reader: ISeekReadIndexedRowRead // read forward let mutable fin = false - let mutable curr = mid + let mutable curr = mid + 1 while not fin do if curr > numRows then @@ -1287,6 +1288,8 @@ let seekReadIndexedRowsRange numRows binaryChop (reader: ISeekReadIndexedRowRead else fin <- true + rid <- rid + 1 + startRid, endRid let seekReadIndexedRowsByInterface numRows binaryChop (reader: ISeekReadIndexedRowReader<'RowT, _, _>) =