Skip to content

Commit 8984899

Browse files
committed
perf: added benchmarks
1 parent dc13437 commit 8984899

File tree

8 files changed

+94
-3
lines changed

8 files changed

+94
-3
lines changed

FileSizeFromBase64.NET.sln

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,13 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{55C2DD39-3BE
77
EndProject
88
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{36D68C5A-786B-4576-940D-A636E667127A}"
99
EndProject
10-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FileSizeFromBase64.NET", "src\FileSizeFromBase64.NET\FileSizeFromBase64.NET.csproj", "{7CBE7079-23DF-4EE0-899A-62C030D89777}"
10+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FileSizeFromBase64.NET", "src\FileSizeFromBase64.NET\FileSizeFromBase64.NET.csproj", "{7CBE7079-23DF-4EE0-899A-62C030D89777}"
1111
EndProject
12-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FileSizeFromBase64.NET.Tests", "tests\FileSizeFromBase64.NET.Tests\FileSizeFromBase64.NET.Tests.csproj", "{FF13BB86-E941-42C8-9419-908AC08F80E8}"
12+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FileSizeFromBase64.NET.Tests", "tests\FileSizeFromBase64.NET.Tests\FileSizeFromBase64.NET.Tests.csproj", "{FF13BB86-E941-42C8-9419-908AC08F80E8}"
1313
EndProject
14-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FileSizeFromBase64.NET.ConsoleApp", "tests\FileSizeFromBase64.NET.ConsoleApp\FileSizeFromBase64.NET.ConsoleApp.csproj", "{100450D0-E6CE-4D9D-8A0C-B909392F65C4}"
14+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FileSizeFromBase64.NET.ConsoleApp", "tests\FileSizeFromBase64.NET.ConsoleApp\FileSizeFromBase64.NET.ConsoleApp.csproj", "{100450D0-E6CE-4D9D-8A0C-B909392F65C4}"
15+
EndProject
16+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FileSizeFromBase64.Benchmarks", "tests\FileSizeFromBase64.Benchmarks\FileSizeFromBase64.Benchmarks.csproj", "{691C89B2-AD2B-49FC-B5FD-C4F97F717A45}"
1517
EndProject
1618
Global
1719
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -31,6 +33,10 @@ Global
3133
{100450D0-E6CE-4D9D-8A0C-B909392F65C4}.Debug|Any CPU.Build.0 = Debug|Any CPU
3234
{100450D0-E6CE-4D9D-8A0C-B909392F65C4}.Release|Any CPU.ActiveCfg = Release|Any CPU
3335
{100450D0-E6CE-4D9D-8A0C-B909392F65C4}.Release|Any CPU.Build.0 = Release|Any CPU
36+
{691C89B2-AD2B-49FC-B5FD-C4F97F717A45}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
37+
{691C89B2-AD2B-49FC-B5FD-C4F97F717A45}.Debug|Any CPU.Build.0 = Debug|Any CPU
38+
{691C89B2-AD2B-49FC-B5FD-C4F97F717A45}.Release|Any CPU.ActiveCfg = Release|Any CPU
39+
{691C89B2-AD2B-49FC-B5FD-C4F97F717A45}.Release|Any CPU.Build.0 = Release|Any CPU
3440
EndGlobalSection
3541
GlobalSection(SolutionProperties) = preSolution
3642
HideSolutionNode = FALSE
@@ -39,6 +45,7 @@ Global
3945
{7CBE7079-23DF-4EE0-899A-62C030D89777} = {55C2DD39-3BE6-4123-918B-E9DBC725B6AE}
4046
{FF13BB86-E941-42C8-9419-908AC08F80E8} = {36D68C5A-786B-4576-940D-A636E667127A}
4147
{100450D0-E6CE-4D9D-8A0C-B909392F65C4} = {36D68C5A-786B-4576-940D-A636E667127A}
48+
{691C89B2-AD2B-49FC-B5FD-C4F97F717A45} = {36D68C5A-786B-4576-940D-A636E667127A}
4249
EndGlobalSection
4350
GlobalSection(ExtensibilityGlobals) = postSolution
4451
SolutionGuid = {1BEC19AE-AECE-469D-962B-4F8E4282EF8E}
172 KB
Loading
94.4 KB
Loading
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<OutputType>Exe</OutputType>
5+
<TargetFramework>net6.0</TargetFramework>
6+
<ImplicitUsings>enable</ImplicitUsings>
7+
<Nullable>enable</Nullable>
8+
</PropertyGroup>
9+
10+
<ItemGroup>
11+
<PackageReference Include="BenchmarkDotNet" Version="0.13.1" />
12+
</ItemGroup>
13+
14+
<ItemGroup>
15+
<ProjectReference Include="..\..\src\FileSizeFromBase64.NET\FileSizeFromBase64.NET.csproj" />
16+
</ItemGroup>
17+
18+
<ItemGroup>
19+
<None Update="data.txt">
20+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
21+
</None>
22+
</ItemGroup>
23+
24+
</Project>
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
using BenchmarkDotNet.Attributes;
2+
using FileSizeFromBase64.NET;
3+
4+
namespace FileSizeFromBase64.Benchmarks;
5+
6+
[MediumRunJob]
7+
[MemoryDiagnoser]
8+
public class FileSizeHelpersBenchmark
9+
{
10+
private readonly string _base64;
11+
12+
public FileSizeHelpersBenchmark()
13+
{
14+
_base64 = File.ReadAllText("data.txt");
15+
}
16+
17+
[Benchmark]
18+
public double GetFileSizeFromBase64StringV1() => FileSizeHelpersV1
19+
.GetFileSizeFromBase64String(_base64);
20+
21+
[Benchmark]
22+
public double GetFileSizeFromBase64StringV2() => FileSizeHelpers
23+
.GetFileSizeFromBase64String(_base64);
24+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
using FileSizeFromBase64.NET;
2+
3+
namespace FileSizeFromBase64.Benchmarks;
4+
5+
public static class FileSizeHelpersV1
6+
{
7+
/// <summary>
8+
/// Calculate a file size from base64 string.
9+
/// </summary>
10+
/// <param name="base64String">The base64 string.</param>
11+
/// <param name="applyPaddingsRules">Indicate if the padding management is required or not. Default is false</param>
12+
/// <param name="unitsOfMeasurement">The unit of measure of the file size returned by the method. The default unit of measure is Byte.</param>
13+
/// <returns>The size of the file represented by the base64 string.</returns>
14+
public static double GetFileSizeFromBase64String(string base64String, bool applyPaddingsRules = false, UnitsOfMeasurement unitsOfMeasurement = UnitsOfMeasurement.Byte)
15+
{
16+
if (string.IsNullOrEmpty(base64String)) return 0;
17+
18+
// Remove MIME-type from the base64 string if exists and get the string length
19+
var base64Length = base64String.Contains("base64,") ? base64String.Split(',')[1].Length : base64String.Length;
20+
21+
var fileSizeInByte = Math.Ceiling((double)base64Length / 4) * 3;
22+
23+
if(applyPaddingsRules && base64Length >= 2)
24+
{
25+
var paddings = base64String[^2..];
26+
fileSizeInByte = paddings.Equals("==") ? fileSizeInByte - 2 : paddings[1].Equals('=') ? fileSizeInByte - 1 : fileSizeInByte;
27+
}
28+
29+
return (fileSizeInByte > 0) ? fileSizeInByte / (int)unitsOfMeasurement : 0;
30+
}
31+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
using BenchmarkDotNet.Running;
2+
using FileSizeFromBase64.Benchmarks;
3+
4+
BenchmarkRunner.Run<FileSizeHelpersBenchmark>();

tests/FileSizeFromBase64.Benchmarks/data.txt

Lines changed: 1 addition & 0 deletions
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)