Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="BenchmarkDotNet" Version="0.13.1" />
<PackageReference Include="BenchmarkDotNet" Version="0.15.8" />
</ItemGroup>

<ItemGroup>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,53 +1,49 @@
using BenchmarkDotNet.Attributes;
using CopyArrayElements;

namespace BenchmarkRunner
namespace BenchmarkRunner;

[MemoryDiagnoser]
public class ElementCopierBenchmark
{
public class ElementCopierBenchmark
private static readonly ElementCopier elementCopier = new();
private Article[] benchMarkSourceArray = [];

[Params(1000, 10000)]
public int Size { get; set; }

[GlobalSetup]
public void Setup()
{
Article[] benchMarkSourceArray = Enumerable.Repeat(new Article { Title = "Title", LastUpdate = DateTime.Now }, 10000).ToArray();
private static readonly ElementCopier elementCopier = new ElementCopier();

[Benchmark]
public void CopyUsingAssignment()
{
elementCopier.CopyUsingAssignment(benchMarkSourceArray);
}

[Benchmark]
public void CopyUsingArrayClass()
{
elementCopier.CopyUsingArrayClass(benchMarkSourceArray);
}

[Benchmark]
public void CopyUsingClone()
{
elementCopier.CopyUsingClone(benchMarkSourceArray);
}

[Benchmark]
public void CopyUsingCopyTo()
{
elementCopier.CopyUsingCopyTo(benchMarkSourceArray);
}

[Benchmark]
public void CopyUsingRange()
{
elementCopier.CopyUsingRange(benchMarkSourceArray);
}

[Benchmark]
public void CopyUsingLinq()
{
elementCopier.CopyUsingLinq(benchMarkSourceArray);
}

[Benchmark]
public void ManuallyCopy()
{
elementCopier.ManuallyCopy(benchMarkSourceArray);
}
benchMarkSourceArray = Enumerable
.Repeat(new Article { Title = "Title", LastUpdate = DateTime.Now }, Size)
.ToArray();
}

[Benchmark]
public Article[] CopyUsingAssignment() => elementCopier.CopyUsingAssignment(benchMarkSourceArray);

[Benchmark]
public Article[] CopyUsingArrayClass() => elementCopier.CopyUsingArrayClass(benchMarkSourceArray);

[Benchmark]
public Article[] CopyUsingClone() => elementCopier.CopyUsingClone(benchMarkSourceArray);

[Benchmark]
public Article[] CopyUsingCopyTo() => elementCopier.CopyUsingCopyTo(benchMarkSourceArray);

[Benchmark]
public Article[] CopyUsingRange() => elementCopier.CopyUsingRange(benchMarkSourceArray);

[Benchmark]
public Article[] CopyUsingSpan() => elementCopier.CopyUsingSpan(benchMarkSourceArray);

[Benchmark]
public Article[] CopyUsingCollectionExpression() => elementCopier.CopyUsingCollectionExpression(benchMarkSourceArray);

[Benchmark]
public Article[] CopyUsingLinq() => elementCopier.CopyUsingLinq(benchMarkSourceArray);

[Benchmark]
public Article[] ManuallyCopy() => elementCopier.ManuallyCopy(benchMarkSourceArray);
}
14 changes: 3 additions & 11 deletions collections-arrays/CopyArrayElements/BenchmarkRunner/Program.cs
Original file line number Diff line number Diff line change
@@ -1,12 +1,4 @@
using BenchmarkRunner;
using BenchmarkDotNet.Running;
using BenchmarkRunner;

namespace BenchmarkRunner
{
public class Program
{
static void Main(string[] args)
{
BenchmarkDotNet.Running.BenchmarkRunner.Run<ElementCopierBenchmark>();
}
}
}
BenchmarkSwitcher.FromAssembly(typeof(ElementCopierBenchmark).Assembly).Run(args);
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
namespace CopyArrayElements
namespace CopyArrayElements;

public class Article
{
public class Article
{
public string? Title { get; set; }
public DateTime LastUpdate { get; set; }
public string? Title { get; set; }
public DateTime LastUpdate { get; set; }

public override string ToString()
{
return $" Title: { Title} | Last update:{LastUpdate}";
}
public override string ToString()
{
return $" Title: {Title} | Last update: {LastUpdate:yyyy-MM-dd}";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,9 @@

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="BenchmarkDotNet" Version="0.13.1" />
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -1,61 +1,109 @@
namespace CopyArrayElements
namespace CopyArrayElements;

public class ElementCopier
{
public class ElementCopier
public Article[] CopyUsingAssignment(Article[] initialArray)
{
public Article[] CopyUsingAssignment(Article[] initialArray)
{
var destinationArray = initialArray;
var destinationArray = initialArray;

return destinationArray;
}
return destinationArray;
}

public Article[] CopyUsingArrayClass(Article[] initialArray)
{
var destinationArray = new Article[initialArray.Length];
Array.Copy(initialArray, destinationArray, initialArray.Length);
public Article[] CopyUsingArrayClass(Article[] initialArray)
{
var destinationArray = new Article[initialArray.Length];
Array.Copy(initialArray, destinationArray, initialArray.Length);

return destinationArray;
}
return destinationArray;
}

public Article[] CopyUsingClone(Article[] initialArray)
{
var destinationArray = initialArray.Clone();
public Article[] CopyPartUsingArrayClass(Article[] initialArray)
{
var destinationArray = new Article[initialArray.Length];
Array.Copy(initialArray, 1, destinationArray, 0, initialArray.Length - 1);

return (Article[])destinationArray;
}
return destinationArray;
}

public Article[] CopyUsingCopyTo(Article[] initialArray)
{
var destinationArray = new Article[initialArray.Length];
initialArray.CopyTo(destinationArray, 0);
public Article[] CopyPartUsingRange(Article[] initialArray)
{
var destinationArray = initialArray[1..3];

return (Article[])destinationArray;
}
return destinationArray;
}

public Article[] CopyUsingRange(Article[] initialArray)
{
var destinationArray = initialArray[..];
public Article[] CopyUsingClone(Article[] initialArray)
{
var destinationArray = (Article[])initialArray.Clone();

return destinationArray;
}
return destinationArray;
}

public Article[] CopyUsingLinq(Article[] initialArray)
{
var destinationArray = initialArray
.Select(x => new Article { Title = x.Title, LastUpdate = x.LastUpdate })
.ToArray();
public Article[] CopyUsingCopyTo(Article[] initialArray)
{
var destinationArray = new Article[initialArray.Length];
initialArray.CopyTo(destinationArray, 0);

return destinationArray;
}
return destinationArray;
}

public Article[] ManuallyCopy(Article[] initialArray)
{
var destinationArray = new Article[initialArray.Length];
public Article[] CopyUsingRange(Article[] initialArray)
{
var destinationArray = initialArray[..];

return destinationArray;
}

public Article[] CopyUsingSpan(Article[] initialArray)
{
var destinationArray = new Article[initialArray.Length];
initialArray.AsSpan().CopyTo(destinationArray);

return destinationArray;
}

public Article[] CopyPartUsingSpan(Article[] initialArray)
{
var destinationArray = new Article[initialArray.Length];
initialArray.AsSpan(1, 2).CopyTo(destinationArray);

return destinationArray;
}

public Article[] CopyUsingCollectionExpression(Article[] initialArray)
{
Article[] destinationArray = [.. initialArray];

return destinationArray;
}

public Article[] CopyUsingToArray(Article[] initialArray)
{
var destinationArray = initialArray.ToArray();

return destinationArray;
}

public Article[] CopyUsingLinq(Article[] initialArray)
{
var destinationArray = initialArray
.Select(x => new Article { Title = x.Title, LastUpdate = x.LastUpdate })
.ToArray();

return destinationArray;
}

public Article[] ManuallyCopy(Article[] initialArray)
{
var destinationArray = new Article[initialArray.Length];

for (int index = 0; index < initialArray.Length; index++)
destinationArray[index] = new Article { Title = initialArray[index].Title, LastUpdate = initialArray[index].LastUpdate };
for (int index = 0; index < initialArray.Length; index++)
destinationArray[index] = new Article
{
Title = initialArray[index].Title,
LastUpdate = initialArray[index].LastUpdate
};

return destinationArray;
}
return destinationArray;
}
}
Loading
Loading