Skip to content

Commit e091932

Browse files
committed
Network byte order optimizations when reading data.
1 parent 6dad161 commit e091932

File tree

1 file changed

+26
-11
lines changed

1 file changed

+26
-11
lines changed
Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,107 +1,122 @@
11
using System;
2-
using System.Buffers.Binary;
32
using System.Runtime.CompilerServices;
43

54
namespace RabbitMQ.Util
65
{
76
internal static class NetworkOrderDeserializer
87
{
8+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
99
internal static double ReadDouble(ReadOnlyMemory<byte> memory) => ReadDouble(memory.Span);
1010

11+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
1112
internal static double ReadDouble(ReadOnlySpan<byte> span)
1213
{
1314
if (span.Length < 8)
1415
{
1516
throw new ArgumentOutOfRangeException(nameof(span), "Insufficient length to decode Double from memory.");
1617
}
1718

18-
long val = BinaryPrimitives.ReadInt64BigEndian(span);
19-
return Unsafe.As<long, double>(ref val);
19+
ulong val = ReadUInt64(span);
20+
return Unsafe.As<ulong, double>(ref val);
2021
}
2122

23+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
2224
internal static short ReadInt16(ReadOnlyMemory<byte> memory) => ReadInt16(memory.Span);
2325

26+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
2427
internal static short ReadInt16(ReadOnlySpan<byte> span)
2528
{
2629
if (span.Length < 2)
2730
{
2831
throw new ArgumentOutOfRangeException(nameof(span), "Insufficient length to decode Int16 from memory.");
2932
}
3033

31-
return BinaryPrimitives.ReadInt16BigEndian(span);
34+
return (short)ReadUInt16(span);
3235
}
3336

37+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
3438
internal static int ReadInt32(ReadOnlyMemory<byte> memory) => ReadInt32(memory.Span);
3539

40+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
3641
internal static int ReadInt32(ReadOnlySpan<byte> span)
3742
{
3843
if (span.Length < 4)
3944
{
4045
throw new ArgumentOutOfRangeException(nameof(span), "Insufficient length to decode Int32 from memory.");
4146
}
4247

43-
return BinaryPrimitives.ReadInt32BigEndian(span);
48+
return (int)ReadUInt32(span);
4449
}
4550

51+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
4652
internal static long ReadInt64(ReadOnlyMemory<byte> memory) => ReadInt64(memory.Span);
4753

54+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
4855
internal static long ReadInt64(ReadOnlySpan<byte> span)
4956
{
5057
if (span.Length < 8)
5158
{
5259
throw new ArgumentOutOfRangeException(nameof(span), "Insufficient length to decode Int64 from memory.");
5360
}
5461

55-
return BinaryPrimitives.ReadInt64BigEndian(span);
62+
return (long)ReadUInt64(span);
5663
}
5764

65+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
5866
internal static float ReadSingle(ReadOnlyMemory<byte> memory) => ReadSingle(memory.Span);
5967

68+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
6069
internal static float ReadSingle(ReadOnlySpan<byte> span)
6170
{
6271
if (span.Length < 4)
6372
{
6473
throw new ArgumentOutOfRangeException(nameof(span), "Insufficient length to decode Single from memory.");
6574
}
6675

67-
int num = BinaryPrimitives.ReadInt32BigEndian(span);
68-
return Unsafe.As<int, float>(ref num);
76+
uint num = ReadUInt32(span);
77+
return Unsafe.As<uint, float>(ref num);
6978
}
7079

80+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
7181
internal static ushort ReadUInt16(ReadOnlyMemory<byte> memory) => ReadUInt16(memory.Span);
7282

83+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
7384
internal static ushort ReadUInt16(ReadOnlySpan<byte> span)
7485
{
7586
if (span.Length < 2)
7687
{
7788
throw new ArgumentOutOfRangeException(nameof(span), "Insufficient length to decode UInt16 from memory.");
7889
}
7990

80-
return BinaryPrimitives.ReadUInt16BigEndian(span);
91+
return (ushort)((span[0] << 8) | span[1]);
8192
}
8293

94+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
8395
internal static uint ReadUInt32(ReadOnlyMemory<byte> memory) => ReadUInt32(memory.Span);
8496

97+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
8598
internal static uint ReadUInt32(ReadOnlySpan<byte> span)
8699
{
87100
if (span.Length < 4)
88101
{
89102
throw new ArgumentOutOfRangeException(nameof(span), "Insufficient length to decode UInt32 from memory.");
90103
}
91104

92-
return BinaryPrimitives.ReadUInt32BigEndian(span);
105+
return (uint)((span[0] << 24) | (span[1] << 16) | (span[2] << 8) | span[3]);
93106
}
94107

108+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
95109
internal static ulong ReadUInt64(ReadOnlyMemory<byte> memory) => ReadUInt64(memory.Span);
96110

111+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
97112
internal static ulong ReadUInt64(ReadOnlySpan<byte> span)
98113
{
99114
if (span.Length < 8)
100115
{
101116
throw new ArgumentOutOfRangeException(nameof(span), "Insufficient length to decode UInt64 from memory.");
102117
}
103118

104-
return BinaryPrimitives.ReadUInt64BigEndian(span);
119+
return ((ulong)span[0] << 56) | ((ulong)span[1] << 48) | ((ulong)span[2] << 40) | ((ulong)span[3] << 32) | ((ulong)span[4] << 24) | ((ulong)span[5] << 16) | ((ulong)span[6] << 8) | span[7];
105120
}
106121
}
107122
}

0 commit comments

Comments
 (0)