Skip to content

Commit 99ff9c5

Browse files
committed
Improved Header building for certain providers
1 parent 022c688 commit 99ff9c5

4 files changed

Lines changed: 39 additions & 32 deletions

File tree

Orm/Xtensive.Orm/Orm/Rse/Providers/Compilable/ConcatProvider.cs

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
// Created: 2009.04.01
66

77
using System;
8+
using System.Buffers;
89
using System.Collections.Generic;
910
using System.Linq;
1011

@@ -23,24 +24,30 @@ private static RecordSetHeader BuildHeader(CompilableProvider left, CompilablePr
2324
var leftHeader = left.Header;
2425
var rightHeader = right.Header;
2526
EnsureConcatIsPossible(leftHeader, rightHeader);
27+
2628
var mappedColumnIndexes = new List<int>();
27-
var columns = new List<Column>();
28-
for (int i = 0; i < leftHeader.Columns.Count; i++) {
29+
var rented = ArrayPool<Column>.Shared.Rent(Math.Max(leftHeader.Columns.Count, 64));
30+
var lastIndex = 0;
31+
for (int i = 0, count = leftHeader.Columns.Count; i < count; i++) {
2932
var leftColumn = leftHeader.Columns[i];
3033
var rightColumn = rightHeader.Columns[i];
3134
if (leftColumn is MappedColumn leftMappedColumn && rightColumn is MappedColumn rightMappedColumn) {
3235
if (leftMappedColumn.ColumnInfoRef.Equals(rightMappedColumn.ColumnInfoRef)) {
33-
columns.Add(leftMappedColumn);
36+
rented[lastIndex++] = leftColumn;
3437
mappedColumnIndexes.Add(i);
3538
}
3639
else {
37-
columns.Add(new SystemColumn(leftColumn.Name, leftColumn.Index, leftColumn.Type));
40+
rented[lastIndex++] = new SystemColumn(leftColumn.Name, leftColumn.Index, leftColumn.Type);
3841
}
3942
}
4043
else {
41-
columns.Add(new SystemColumn(leftColumn.Name, leftColumn.Index, leftColumn.Type));
44+
rented[lastIndex++] = new SystemColumn(leftColumn.Name, leftColumn.Index, leftColumn.Type);
4245
}
4346
}
47+
var columns = new Column[lastIndex];
48+
Array.Copy(rented, columns, lastIndex);
49+
ArrayPool<Column>.Shared.Return(rented, true);
50+
4451
var columnGroups = leftHeader.ColumnGroups.Where(cg => cg.Keys.All(mappedColumnIndexes.Contains)).ToList();
4552

4653
return new RecordSetHeader(

Orm/Xtensive.Orm/Orm/Rse/Providers/Compilable/ContainsTableProvider.cs

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -42,15 +42,12 @@ private static RecordSetHeader BuildHeader(FullTextIndexInfo index, string rankC
4242
var primaryIndexKeyColumns = index.PrimaryIndex.KeyColumns;
4343
if (primaryIndexKeyColumns.Count!=1)
4444
throw new InvalidOperationException(Strings.ExOnlySingleColumnKeySupported);
45-
var fieldTypes = primaryIndexKeyColumns
46-
.Select(static columnInfo => columnInfo.Key.ValueType)
47-
.Append(WellKnownTypes.Double)
48-
.ToArray(primaryIndexKeyColumns.Count + 1);
45+
46+
var keyValueType = primaryIndexKeyColumns[0].Key.ValueType;
47+
var fieldTypes = new Type[2] { keyValueType, WellKnownTypes.Double };
4948
var tupleDescriptor = TupleDescriptor.Create(fieldTypes);
50-
var columns = primaryIndexKeyColumns
51-
.Select(static (c, i) => (Column) new MappedColumn("KEY", i, c.Key.ValueType))
52-
.Append(new MappedColumn("RANK", tupleDescriptor.Count, WellKnownTypes.Double))
53-
.ToArray(primaryIndexKeyColumns.Count + 1);;
49+
var columns = new Column[2] { new MappedColumn("KEY", 0, keyValueType), new MappedColumn("RANK", tupleDescriptor.Count, WellKnownTypes.Double) };
50+
5451
return new RecordSetHeader(tupleDescriptor, columns);
5552
}
5653
}

Orm/Xtensive.Orm/Orm/Rse/Providers/Compilable/FreeTextProvider.cs

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -40,15 +40,11 @@ private static RecordSetHeader BuildHeader(FullTextIndexInfo index, string rankC
4040
var primaryIndexKeyColumns = index.PrimaryIndex.KeyColumns;
4141
if (primaryIndexKeyColumns.Count!=1)
4242
throw new InvalidOperationException(Strings.ExOnlySingleColumnKeySupported);
43-
var fieldTypes = primaryIndexKeyColumns
44-
.Select(static columnInfo => columnInfo.Key.ValueType)
45-
.Append(WellKnownTypes.Double)
46-
.ToArray(primaryIndexKeyColumns.Count + 1);
43+
44+
var keyValueType = primaryIndexKeyColumns[0].Key.ValueType;
45+
var fieldTypes = new Type[2] { keyValueType, WellKnownTypes.Double };
4746
var tupleDescriptor = TupleDescriptor.Create(fieldTypes);
48-
var columns = primaryIndexKeyColumns
49-
.Select(static (c, i) => (Column) new MappedColumn("KEY", i, c.Key.ValueType))
50-
.Append(new MappedColumn("RANK", tupleDescriptor.Count, WellKnownTypes.Double))
51-
.ToArray(primaryIndexKeyColumns.Count + 1);
47+
var columns = new Column[2] { new MappedColumn("KEY", 0, keyValueType), new MappedColumn("RANK", tupleDescriptor.Count, WellKnownTypes.Double) };
5248
return new RecordSetHeader(tupleDescriptor, columns);
5349
}
5450
}

Orm/Xtensive.Orm/Orm/Rse/Providers/Compilable/UnionProvider.cs

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
// Created: 2009.04.01
66

77
using System;
8+
using System.Buffers;
89
using System.Collections.Generic;
910
using System.Linq;
1011
using Xtensive.Core;
@@ -25,28 +26,34 @@ private static RecordSetHeader BuildHeader(CompilableProvider left, CompilablePr
2526
var rightHeader = right.Header;
2627
EnsureUnionIsPossible(leftHeader, rightHeader);
2728
var mappedColumnIndexes = new List<int>();
28-
var columns = new List<Column>();
29+
// we can use shared array here and then fast-copy to be more memory-efficient and GC-friendly
30+
var rented = ArrayPool<Column>.Shared.Rent(Math.Max(leftHeader.Columns.Count, 64)); // reduce pool growth
31+
var lastIndex = 0;
2932
for (int i = 0; i < leftHeader.Columns.Count; i++) {
3033
var leftColumn = leftHeader.Columns[i];
3134
var rightColumn = rightHeader.Columns[i];
32-
if (leftColumn is MappedColumn && rightColumn is MappedColumn) {
33-
var leftMappedColumn = (MappedColumn) leftColumn;
34-
var rightMappedColumn = (MappedColumn) rightColumn;
35+
if (leftColumn is MappedColumn leftMappedColumn && rightColumn is MappedColumn rightMappedColumn) {
3536
if (leftMappedColumn.ColumnInfoRef.Equals(rightMappedColumn.ColumnInfoRef)) {
36-
columns.Add(leftMappedColumn);
37+
rented[lastIndex++] = leftColumn;
3738
mappedColumnIndexes.Add(i);
38-
}
39-
else
40-
columns.Add(new SystemColumn(leftColumn.Name, leftColumn.Index, leftColumn.Type));
39+
}
40+
else {
41+
rented[lastIndex++] = new SystemColumn(leftColumn.Name, leftColumn.Index, leftColumn.Type);
42+
}
43+
}
44+
else {
45+
rented[lastIndex++] = new SystemColumn(leftColumn.Name, leftColumn.Index, leftColumn.Type);
4146
}
42-
else
43-
columns.Add(new SystemColumn(leftColumn.Name, leftColumn.Index, leftColumn.Type));
4447
}
48+
var columns = new Column[lastIndex];
49+
Array.Copy(rented, columns, lastIndex);
50+
ArrayPool<Column>.Shared.Return(rented, true); // not sure we can make it false, becasue
51+
4552
var columnGroups = leftHeader.ColumnGroups.Where(cg => cg.Keys.All(mappedColumnIndexes.Contains)).ToList();
4653

4754
return new RecordSetHeader(
4855
leftHeader.TupleDescriptor,
49-
columns,
56+
columns,
5057
columnGroups,
5158
null,
5259
null);

0 commit comments

Comments
 (0)