Skip to content
This repository was archived by the owner on Oct 12, 2025. It is now read-only.

Commit fc48f2b

Browse files
去掉一些多余的内存分配 (#808)
1 parent 7cbe771 commit fc48f2b

File tree

10 files changed

+32
-28
lines changed

10 files changed

+32
-28
lines changed

Lagrange.Core/Internal/Context/HighwayContext.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ private static (RespDataHighwayHead, BinaryPacket) ParsePacket(BinaryPacket pack
201201
{
202202
int headLength = packet.ReadInt();
203203
int bodyLength = packet.ReadInt();
204-
var head = Serializer.Deserialize<RespDataHighwayHead>(packet.ReadBytes(headLength));
204+
var head = Serializer.Deserialize<RespDataHighwayHead>(packet.ReadBytes(headLength).AsSpan());
205205
var body = packet.ReadPacket(bodyLength);
206206

207207
if (packet.ReadByte() == 0x29) return (head, body);

Lagrange.Core/Internal/Packets/SsoPacker.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,8 @@ public static SsoPacket Parse(BinaryPacket packet)
6464
var msgCookie = headReader.ReadBytes(Prefix.Uint32 | Prefix.WithPrefix);
6565
int isCompressed = headReader.ReadInt();
6666
var reserveField = headReader.ReadBytes(Prefix.Uint32 | Prefix.WithPrefix);
67-
68-
var body = packet.ReadBytes(Prefix.Uint32 | Prefix.WithPrefix).ToArray();
67+
68+
var body = packet.ReadBytes(Prefix.Uint32 | Prefix.WithPrefix);
6969
var raw = isCompressed switch
7070
{
7171
0 or 4 => body,

Lagrange.Core/Internal/Service/Message/PushMessageService.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ private static void ProcessEvent0x2DC(Span<byte> payload, PushMsg msg, List<Prot
138138
_ = packet.ReadUint(); // group uin
139139
_ = packet.ReadByte(); // unknown byte
140140
var proto = packet.ReadBytes(Prefix.Uint16 | Prefix.LengthOnly); // proto length error
141-
var msgBody = Serializer.Deserialize<NotifyMessageBody>(proto);
141+
var msgBody = Serializer.Deserialize<NotifyMessageBody>(proto.AsSpan());
142142
switch ((Event0x2DCSubType16Field13)(msgBody.Field13 ?? 0))
143143
{
144144
case Event0x2DCSubType16Field13.GroupMemberSpecialTitleNotice:
@@ -178,7 +178,7 @@ private static void ProcessEvent0x2DC(Span<byte> payload, PushMsg msg, List<Prot
178178
_ = packet.ReadUint(); // group uin
179179
_ = packet.ReadByte(); // unknown byte
180180
var proto = packet.ReadBytes(Prefix.Uint16 | Prefix.LengthOnly);
181-
var recall = Serializer.Deserialize<NotifyMessageBody>(proto);
181+
var recall = Serializer.Deserialize<NotifyMessageBody>(proto.AsSpan());
182182
var meta = recall.Recall.RecallMessages[0];
183183
var groupRecallEvent = GroupSysRecallEvent.Result(
184184
recall.GroupUin,
@@ -213,7 +213,7 @@ private static void ProcessEvent0x2DC(Span<byte> payload, PushMsg msg, List<Prot
213213
_ = packet.ReadUint(); // group uin
214214
_ = packet.ReadByte(); // unknown byte
215215
var proto = packet.ReadBytes(Prefix.Uint16 | Prefix.LengthOnly);
216-
var essence = Serializer.Deserialize<NotifyMessageBody>(proto);
216+
var essence = Serializer.Deserialize<NotifyMessageBody>(proto.AsSpan());
217217
var essenceMsg = essence.EssenceMessage;
218218
var groupEssenceEvent = GroupSysEssenceEvent.Result(essenceMsg.GroupUin, essenceMsg.MsgSequence,
219219
essenceMsg.Random, essenceMsg.SetFlag, essenceMsg.MemberUin, essenceMsg.OperatorUin);
@@ -226,7 +226,7 @@ private static void ProcessEvent0x2DC(Span<byte> payload, PushMsg msg, List<Prot
226226
uint groupUin = packet.ReadUint(); // group uin
227227
_ = packet.ReadByte(); // unknown byte
228228
var proto = packet.ReadBytes(Prefix.Uint16 | Prefix.LengthOnly);
229-
var greyTip = Serializer.Deserialize<NotifyMessageBody>(proto);
229+
var greyTip = Serializer.Deserialize<NotifyMessageBody>(proto.AsSpan());
230230

231231
var templates = greyTip.GeneralGrayTip.MsgTemplParam.ToDictionary(x => x.Name, x => x.Value);
232232

Lagrange.Core/Message/Entity/FileEntity.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ internal FileEntity(long fileSize, string fileName, byte[] fileMd5, string fileU
100100
var payload = new BinaryPacket(trans.ElemValue);
101101
payload.Skip(1);
102102
var data = payload.ReadBytes(Prefix.Uint16 | Prefix.LengthOnly);
103-
var extra = Serializer.Deserialize<GroupFileExtra>(data).Inner.Info;
103+
var extra = Serializer.Deserialize<GroupFileExtra>(data.AsSpan()).Inner.Info;
104104

105105
return new FileEntity
106106
{

Lagrange.Core/Message/Entity/JsonEntity.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ public class JsonEntity : IMessageEntity
1212
public string Json { get; set; }
1313

1414
public string ResId { get; set; }
15+
16+
private static ReadOnlySpan<byte> Header => new byte[1] { 0x01 };
1517

1618
public JsonEntity()
1719
{
@@ -44,7 +46,7 @@ IEnumerable<Elem> IMessageEntity.PackElement()
4446
RichMsg = new RichMsg
4547
{
4648
ServiceId = 1,
47-
Template1 = ZCompression.ZCompress(Json, new byte[] { 0x01 }),
49+
Template1 = ZCompression.ZCompress(Json, Header),
4850
}
4951
}
5052
};
@@ -54,7 +56,7 @@ IEnumerable<Elem> IMessageEntity.PackElement()
5456
{
5557
if (elems.RichMsg is { ServiceId: 1, Template1: not null } richMsg)
5658
{
57-
var json = ZCompression.ZDecompress(richMsg.Template1[1..]);
59+
var json = ZCompression.ZDecompress(richMsg.Template1.AsSpan(1));
5860
return new XmlEntity(Encoding.UTF8.GetString(json));
5961
}
6062

Lagrange.Core/Message/Entity/LightAppEntity.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ IEnumerable<Elem> IMessageEntity.PackElement()
4646
{
4747
if (elems.LightAppElem is { } lightApp)
4848
{
49-
var payload = ZCompression.ZDecompress(lightApp.Data[1..], false);
49+
var payload = ZCompression.ZDecompress(lightApp.Data.AsSpan(1), false);
5050
string json = Encoding.UTF8.GetString(payload);
5151
string? app = JsonNode.Parse(json)?["app"]?.ToString();
5252

Lagrange.Core/Message/Entity/XmlEntity.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ public class XmlEntity : IMessageEntity
1111
public string Xml { get; set; }
1212

1313
public int ServiceId { get; set; } = 35;
14-
14+
15+
private static ReadOnlySpan<byte> Header => new byte[1] { 0x01 };
16+
1517
public XmlEntity() => Xml = "";
1618

1719
public XmlEntity(string xml) => Xml = xml;
@@ -27,7 +29,7 @@ IEnumerable<Elem> IMessageEntity.PackElement()
2729
RichMsg = new RichMsg
2830
{
2931
ServiceId = ServiceId,
30-
Template1 = ZCompression.ZCompress(Xml, new byte[] { 0x01 }),
32+
Template1 = ZCompression.ZCompress(Xml, Header),
3133
}
3234
}
3335
};
@@ -37,7 +39,7 @@ IEnumerable<Elem> IMessageEntity.PackElement()
3739
{
3840
if (elems.RichMsg is { ServiceId: 35, Template1: not null } richMsg)
3941
{
40-
var xml = ZCompression.ZDecompress(richMsg.Template1.Skip(1).ToArray());
42+
var xml = ZCompression.ZDecompress(richMsg.Template1.AsSpan(1));
4143
return new XmlEntity(Encoding.UTF8.GetString(xml));
4244
}
4345

Lagrange.Core/Utility/Binary/BinaryPacket.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -237,17 +237,17 @@ public long ReadLong()
237237
return BinaryPrimitives.ReadInt64BigEndian(buffer);
238238
}
239239

240-
public Span<byte> ReadBytes(int count)
240+
public byte[] ReadBytes(int count)
241241
{
242242
if (_stream.Length - _stream.Position < count) throw new InvalidDataException("Not enough data to read, remaining: " + (_stream.Length - _stream.Position) + " required: " + count);
243243
if (count < 0) throw new InvalidDataException("Invalid count to read, count: " + count);
244-
245-
Span<byte> buffer = new byte[count];
244+
245+
byte[] buffer = new byte[count];
246246
_ = _stream.Read(buffer);
247247
return buffer;
248248
}
249249

250-
public Span<byte> ReadBytes(Prefix flag)
250+
public byte[] ReadBytes(Prefix flag)
251251
{
252252
int length = ReadLength(flag);
253253
if (_stream.Length - _stream.Position < length) throw new InvalidDataException("Not enough data to read, remaining: " + (_stream.Length - _stream.Position) + " required: " + length);
@@ -264,7 +264,7 @@ public string ReadString(Prefix flag)
264264

265265
public string ReadString(int count) => Encoding.UTF8.GetString(ReadBytes(count));
266266

267-
public BinaryPacket ReadPacket(int count) => new(ReadBytes(count).ToArray());
267+
public BinaryPacket ReadPacket(int count) => new(ReadBytes(count));
268268

269269
public void Skip(int length) => _reader.BaseStream.Seek(length, SeekOrigin.Current);
270270

Lagrange.Core/Utility/Binary/Compression/Common.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,16 @@ namespace Lagrange.Core.Utility.Binary.Compression;
66

77
internal static class Common
88
{
9-
public static byte[] Deflate(byte[] data)
9+
public static byte[] Deflate(ReadOnlySpan<byte> data)
1010
{
1111
using var memoryStream = new MemoryStream();
1212
using var deflateStream = new DeflateStream(memoryStream, CompressionMode.Compress);
13-
deflateStream.Write(data, 0, data.Length);
13+
deflateStream.Write(data);
1414
deflateStream.Close();
1515
return memoryStream.ToArray();
1616
}
1717

18-
public static byte[] Inflate(Span<byte> data)
18+
public static byte[] Inflate(ReadOnlySpan<byte> data)
1919
{
2020
using var ms = new MemoryStream();
2121
using var ds = new DeflateStream(ms, CompressionMode.Decompress, true);

Lagrange.Core/Utility/Binary/Compression/ZCompression.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ namespace Lagrange.Core.Utility.Binary.Compression;
44

55
internal static class ZCompression
66
{
7-
public static byte[] ZCompress(byte[] data, byte[]? header = null)
7+
public static byte[] ZCompress(ReadOnlySpan<byte> data, ReadOnlySpan<byte> header = default)
88
{
99
using var stream = new MemoryStream();
1010
var deflate = Common.Deflate(data);
@@ -13,17 +13,17 @@ public static byte[] ZCompress(byte[] data, byte[]? header = null)
1313
stream.WriteByte(0x78); // Zlib header
1414
stream.WriteByte(0xDA); // Zlib header
1515

16-
stream.Write(deflate.AsSpan());
16+
stream.Write(deflate);
1717

1818
var checksum = Adler32(data);
19-
stream.Write(checksum.AsSpan());
19+
stream.Write(checksum);
2020

2121
return stream.ToArray();
2222
}
2323

24-
public static byte[] ZCompress(string data, byte[]? header = null) => ZCompress(Encoding.UTF8.GetBytes(data), header);
24+
public static byte[] ZCompress(string data, ReadOnlySpan<byte> header = default) => ZCompress(Encoding.UTF8.GetBytes(data), header);
2525

26-
public static byte[] ZDecompress(Span<byte> data, bool validate = true)
26+
public static byte[] ZDecompress(ReadOnlySpan<byte> data, bool validate = true)
2727
{
2828
var checksum = data[^4..];
2929

@@ -32,7 +32,7 @@ public static byte[] ZDecompress(Span<byte> data, bool validate = true)
3232
return inflate;
3333
}
3434

35-
private static byte[] Adler32(byte[] data)
35+
private static byte[] Adler32(ReadOnlySpan<byte> data)
3636
{
3737
uint a = 1, b = 0;
3838
foreach (byte t in data)

0 commit comments

Comments
 (0)