From 052bcaa29d7d0afb64e3f959cd5d48f1b8571a79 Mon Sep 17 00:00:00 2001 From: Macocian Alexandru Victor Date: Fri, 6 Jun 2025 09:08:13 +0200 Subject: [PATCH] Greatly improve installer performance (#994) --- Daybreak.Installer/Daybreak.Installer.csproj | 7 ++-- Daybreak.Installer/Program.cs | 35 +++++++++++--------- 2 files changed, 23 insertions(+), 19 deletions(-) diff --git a/Daybreak.Installer/Daybreak.Installer.csproj b/Daybreak.Installer/Daybreak.Installer.csproj index 9a0bd546..51ad1ebe 100644 --- a/Daybreak.Installer/Daybreak.Installer.csproj +++ b/Daybreak.Installer/Daybreak.Installer.csproj @@ -1,4 +1,4 @@ - + Exe @@ -6,10 +6,11 @@ enable enable AnyCPU;x86 - True True - True win-x86 + true + true + 0.9.9.72 diff --git a/Daybreak.Installer/Program.cs b/Daybreak.Installer/Program.cs index ed1a3a6e..ef6c1150 100644 --- a/Daybreak.Installer/Program.cs +++ b/Daybreak.Installer/Program.cs @@ -3,6 +3,8 @@ using System.Diagnostics; using System.IO.Compression; using System.Text; +var cts = new CancellationTokenSource(); + static void RenderProgressBar(int currentStep, int totalSteps, int barSize) { Console.CursorLeft = 0; // Reset cursor position to the start of the line @@ -34,8 +36,7 @@ if (File.Exists(updatePkg)) Console.WriteLine("Unpacking files..."); using var fileStream = new FileStream(updatePkg, FileMode.Open); - var sizeBuffer = new byte[4]; - var copyBuffer = new byte[1024]; + var copyBuffer = new Memory(new byte[4096]); while (fileStream.Position < fileStream.Length - 1) { /* @@ -48,32 +49,34 @@ if (File.Exists(updatePkg)) * Binary data */ - await fileStream.ReadAsync(sizeBuffer, 0, 4); - var fileNameSize = BitConverter.ToInt32(sizeBuffer, 0); - var fileNameBuffer = new byte[fileNameSize]; - await fileStream.ReadAsync(fileNameBuffer, 0, fileNameSize); - var fileName = Encoding.UTF8.GetString(fileNameBuffer); + var sizeBuffer = copyBuffer[..4]; + await fileStream.ReadExactlyAsync(sizeBuffer); + var fileNameSize = BitConverter.ToInt32(sizeBuffer.Span); + var fileNameBuffer = copyBuffer[..fileNameSize]; + await fileStream.ReadExactlyAsync(fileNameBuffer); + var fileName = Encoding.UTF8.GetString(fileNameBuffer.Span); RenderProgressBar((int)fileStream.Position, (int)fileStream.Length, 40); - await fileStream.ReadAsync(sizeBuffer, 0, 4); - var relativePathSize = BitConverter.ToInt32(sizeBuffer, 0); - var relativePathBuffer = new byte[relativePathSize]; - await fileStream.ReadAsync(relativePathBuffer, 0, relativePathSize); - var relativePath = Encoding.UTF8.GetString(relativePathBuffer); + await fileStream.ReadExactlyAsync(sizeBuffer); + var relativePathSize = BitConverter.ToInt32(sizeBuffer.Span); + var relativePathBuffer = copyBuffer[..relativePathSize]; + await fileStream.ReadExactlyAsync(relativePathBuffer); + var relativePath = Encoding.UTF8.GetString(relativePathBuffer.Span); RenderProgressBar((int)fileStream.Position, (int)fileStream.Length, 40); - await fileStream.ReadAsync(sizeBuffer, 0, 4); - var binarySize = BitConverter.ToInt32(sizeBuffer, 0); + await fileStream.ReadExactlyAsync(sizeBuffer); + var binarySize = BitConverter.ToInt32(sizeBuffer.Span); var fileInfo = new FileInfo(relativePath); fileInfo.Directory!.Create(); using var destinationStream = new FileStream(relativePath, FileMode.Create); while(binarySize > 0) { var toRead = Math.Min(binarySize, copyBuffer.Length); - await fileStream.ReadAsync(copyBuffer, 0, toRead); - await destinationStream.WriteAsync(copyBuffer, 0, toRead); + var readBuffer = copyBuffer[..toRead]; + await fileStream.ReadExactlyAsync(readBuffer); + await destinationStream.WriteAsync(readBuffer); binarySize -= toRead; RenderProgressBar((int)fileStream.Position, (int)fileStream.Length, 40);