Skip to content

Commit fdd2de6

Browse files
committed
[Core] FlashTransferUpload Perf Optimize
1 parent bd1cd6f commit fdd2de6

2 files changed

Lines changed: 27 additions & 40 deletions

File tree

Lagrange.Core/Internal/Context/FlashTransferContext.cs

Lines changed: 26 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using Lagrange.Core.Internal.Packets.Service;
33
using Lagrange.Core.Utility;
44
using Lagrange.Core.Utility.Cryptography;
5+
using Lagrange.Core.Utility.Extension;
56

67
namespace Lagrange.Core.Internal.Context;
78

@@ -23,59 +24,45 @@ internal FlashTransferContext(BotContext botContext)
2324

2425
public async Task<bool> UploadFile(string uKey, Stream bodyStream)
2526
{
26-
byte[] body;
27-
if (bodyStream is MemoryStream ms)
28-
{
29-
body = ms.ToArray();
30-
}
31-
else
32-
{
33-
bodyStream.Position = 0;
34-
var buffer = new byte[bodyStream.Length];
35-
await bodyStream.ReadExactlyAsync(buffer, 0, buffer.Length);
36-
body = buffer;
37-
}
38-
39-
return await UploadFile(uKey, body);
40-
}
41-
42-
public async Task<bool> UploadFile(string uKey, byte[] body)
43-
{
44-
var chunkSha1S = new FlashTransferSha1StateV { State = [] };
45-
var chunkBuffers = new List<byte[]>();
46-
var chunkCount = (uint)((body.Length + ChunkSize - 1) / ChunkSize);
27+
var sha1StateVs = new FlashTransferSha1StateV { State = [] };
28+
var chunkCount = (uint)((bodyStream.Length + ChunkSize - 1) / ChunkSize);
4729

48-
using var accStream = new MemoryStream();
30+
var sha1Stream = new Sha1Stream();
4931
for (uint i = 0; i < chunkCount; i++)
5032
{
51-
var chunkBuffer = body.AsSpan((int)(i * ChunkSize), (int)Math.Min(ChunkSize, body.Length - i * ChunkSize))
52-
.ToArray();
53-
chunkBuffers.Add(chunkBuffer);
54-
5533
if (i != chunkCount - 1)
5634
{
57-
accStream.Write(chunkBuffer, 0, chunkBuffer.Length);
58-
var accBytes = accStream.ToArray();
59-
var sha1Stream = new Sha1Stream();
35+
var accLength = (int)((i + 1) * ChunkSize);
36+
var accBuffer = new byte[accLength];
37+
38+
bodyStream.Position = 0;
39+
await bodyStream.ReadExactlyAsync(accBuffer, 0, accLength);
40+
41+
var accSpan = accBuffer.AsSpan();
6042
var digest = new byte[20];
61-
sha1Stream.Update(accBytes);
43+
sha1Stream.Update(accSpan);
6244
sha1Stream.Hash(digest, false);
63-
chunkSha1S.State.Add(digest);
45+
sha1Stream.Reset();
46+
sha1StateVs.State.Add(digest.ToArray());
6447
}
6548
else
6649
{
67-
chunkSha1S.State.Add(SHA1.HashData(body));
50+
bodyStream.Position = 0;
51+
sha1StateVs.State.Add(bodyStream.Sha1());
6852
}
6953
}
7054

71-
// cnm闹禅tx为什么不能并发,回答我
72-
foreach (var chunkBuffer in chunkBuffers)
55+
for (uint i = 0; i < chunkCount; i++)
7356
{
74-
var success = await UploadChunk(uKey, (uint)(chunkBuffers.IndexOf(chunkBuffer) * ChunkSize), chunkSha1S, chunkBuffer);
75-
if (!success)
76-
{
77-
return false;
78-
}
57+
var chunkStart = (long)(i * ChunkSize);
58+
var chunkLength = (int)Math.Min(ChunkSize, bodyStream.Length - chunkStart);
59+
60+
bodyStream.Position = chunkStart;
61+
var uploadBuffer = new byte[chunkLength];
62+
await bodyStream.ReadExactlyAsync(uploadBuffer, 0, chunkLength);
63+
64+
var success = await UploadChunk(uKey, (uint)chunkStart, sha1StateVs, uploadBuffer);
65+
if (!success) return false;
7966
}
8067

8168
return true;

Lagrange.Core/Utility/Cryptography/Sha1Stream.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public Sha1Stream() // Initialize SHA1 context
3030
Reset();
3131
}
3232

33-
private void Reset()
33+
public void Reset()
3434
{
3535
_state[0] = 0x67452301;
3636
_state[1] = 0xEFCDAB89;

0 commit comments

Comments
 (0)