Skip to content

Commit 8582f50

Browse files
authored
Optimize PacketFieldAccessor replace Rank checking by virtual function (#196)
1 parent 879d343 commit 8582f50

File tree

1 file changed

+16
-34
lines changed

1 file changed

+16
-34
lines changed

Orm/Xtensive.Orm/Tuples/Packed/PackedFieldAccessor.cs

+16-34
Original file line numberDiff line numberDiff line change
@@ -167,12 +167,8 @@ internal abstract class ValueFieldAccessor<T> : ValueFieldAccessor
167167

168168
protected virtual long Encode(T value) => throw new NotSupportedException();
169169

170-
protected virtual void Encode(T value, long[] values, int offset) => throw new NotSupportedException();
171-
172170
protected virtual T Decode(long value) => throw new NotSupportedException();
173171

174-
protected virtual T Decode(long[] values, int offset) => throw new NotSupportedException();
175-
176172
public override object GetUntypedValue(PackedTuple tuple, in PackedFieldDescriptor descriptor, out TupleFieldState fieldState)
177173
{
178174
fieldState = tuple.GetFieldState(descriptor);
@@ -233,31 +229,17 @@ private void SetNullableValue(PackedTuple tuple, in PackedFieldDescriptor descri
233229
}
234230
}
235231

236-
private void Store(PackedTuple tuple, in PackedFieldDescriptor d, T value)
232+
protected virtual void Store(PackedTuple tuple, in PackedFieldDescriptor d, T value)
237233
{
238-
var valueIndex = d.GetValueIndex();
239-
if (Rank > 6) {
240-
Encode(value, tuple.Values, valueIndex);
241-
return;
242-
}
243-
244234
var encoded = Encode(value);
245-
ref var block = ref tuple.Values[valueIndex];
235+
ref var block = ref tuple.Values[d.GetValueIndex()];
246236
var valueBitOffset = d.GetValueBitOffset();
247237
var mask = ValueBitMask << valueBitOffset;
248238
block = (block & ~mask) | ((encoded << valueBitOffset) & mask);
249239
}
250240

251-
private T Load(PackedTuple tuple, in PackedFieldDescriptor d)
252-
{
253-
var valueIndex = d.GetValueIndex();
254-
if (Rank > 6) {
255-
return Decode(tuple.Values, valueIndex);
256-
}
257-
258-
var encoded = (tuple.Values[valueIndex] >> d.GetValueBitOffset()) & ValueBitMask;
259-
return Decode(encoded);
260-
}
241+
protected virtual T Load(PackedTuple tuple, in PackedFieldDescriptor d) =>
242+
Decode((tuple.Values[d.GetValueIndex()] >> d.GetValueBitOffset()) & ValueBitMask);
261243

262244
protected ValueFieldAccessor(int bits, byte index)
263245
: base(bits, index)
@@ -551,18 +533,18 @@ public ULongFieldAccessor()
551533

552534
internal sealed class GuidFieldAccessor : ValueFieldAccessor<Guid>
553535
{
554-
protected override Guid Decode(long[] values, int offset)
536+
protected override Guid Load(PackedTuple tuple, in PackedFieldDescriptor d)
555537
{
556538
unsafe {
557-
fixed (long* valuePtr = &values[offset])
539+
fixed (long* valuePtr = &tuple.Values[d.GetValueIndex()])
558540
return *(Guid*) valuePtr;
559541
}
560542
}
561543

562-
protected override void Encode(Guid value, long[] values, int offset)
544+
protected override void Store(PackedTuple tuple, in PackedFieldDescriptor d, Guid value)
563545
{
564546
unsafe {
565-
fixed (long* valuePtr = &values[offset])
547+
fixed (long* valuePtr = &tuple.Values[d.GetValueIndex()])
566548
*(Guid*) valuePtr = value;
567549
}
568550
}
@@ -583,18 +565,18 @@ public GuidFieldAccessor()
583565

584566
internal sealed class DecimalFieldAccessor : ValueFieldAccessor<decimal>
585567
{
586-
protected override decimal Decode(long[] values, int offset)
568+
protected override decimal Load(PackedTuple tuple, in PackedFieldDescriptor d)
587569
{
588570
unsafe {
589-
fixed (long* valuePtr = &values[offset])
571+
fixed (long* valuePtr = &tuple.Values[d.GetValueIndex()])
590572
return *(decimal*) valuePtr;
591573
}
592574
}
593575

594-
protected override void Encode(decimal value, long[] values, int offset)
576+
protected override void Store(PackedTuple tuple, in PackedFieldDescriptor d, decimal value)
595577
{
596578
unsafe {
597-
fixed (long* valuePtr = &values[offset])
579+
fixed (long* valuePtr = &tuple.Values[d.GetValueIndex()])
598580
*(decimal*) valuePtr = value;
599581
}
600582
}
@@ -610,18 +592,18 @@ public DecimalFieldAccessor()
610592

611593
internal sealed class DateTimeOffsetFieldAccessor : ValueFieldAccessor<DateTimeOffset>
612594
{
613-
protected override DateTimeOffset Decode(long[] values, int offset)
595+
protected override DateTimeOffset Load(PackedTuple tuple, in PackedFieldDescriptor d)
614596
{
615597
unsafe {
616-
fixed (long* valuePtr = &values[offset])
598+
fixed (long* valuePtr = &tuple.Values[d.GetValueIndex()])
617599
return *(DateTimeOffset*) valuePtr;
618600
}
619601
}
620602

621-
protected override void Encode(DateTimeOffset value, long[] values, int offset)
603+
protected override void Store(PackedTuple tuple, in PackedFieldDescriptor d, DateTimeOffset value)
622604
{
623605
unsafe {
624-
fixed (long* valuePtr = &values[offset])
606+
fixed (long* valuePtr = &tuple.Values[d.GetValueIndex()])
625607
*(DateTimeOffset*) valuePtr = value;
626608
}
627609
}

0 commit comments

Comments
 (0)