-
Notifications
You must be signed in to change notification settings - Fork 5k
Try to improve List enumerator perf #116150
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
Tagging subscribers to this area: @dotnet/area-system-collections |
@EgorBot -arm -amd -intel using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;
BenchmarkSwitcher.FromAssembly(typeof(Bench).Assembly).Run(args);
[MemoryDiagnoser(false)]
public class Bench
{
[Benchmark]
[ArgumentsSource(nameof(GetLists))]
public int SumList(List<int> list)
{
int sum = 0;
foreach (int item in list)
{
sum += item;
}
return sum;
}
[Benchmark]
[ArgumentsSource(nameof(GetLists))]
public int SumEnumerable(IEnumerable<int> list)
{
int sum = 0;
foreach (int item in list)
{
sum += item;
}
return sum;
}
public static IEnumerable<List<int>> GetLists() =>
from count in new int[] { 1, 10, 1_000 }
select Enumerable.Range(0, count).ToList();
} |
@EgorBot -arm -amd -intel using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;
using System.Runtime.CompilerServices;
BenchmarkSwitcher.FromAssembly(typeof(Bench).Assembly).Run(args);
[DisassemblyDiagnoser]
[MemoryDiagnoser(false)]
public class Bench
{
[Benchmark]
[ArgumentsSource(nameof(GetLists))]
public int SumList(List<string> list)
{
int sum = 0;
foreach (var item in list)
{
sum += Process(item);
}
return sum;
}
[Benchmark]
[ArgumentsSource(nameof(GetLists))]
public int SumEnumerable(IEnumerable<string> list)
{
int sum = 0;
foreach (var item in list)
{
sum += Process(item);
}
return sum;
}
[MethodImpl(MethodImplOptions.NoInlining)]
private static int Process(string item) => item.Length;
public static IEnumerable<List<string>> GetLists() =>
from count in new int[] { 1, 10, 1_000 }
select Enumerable.Range(0, count).Select(i => i.ToString()).ToList();
} |
src/libraries/System.Private.CoreLib/src/System/Collections/Generic/List.cs
Outdated
Show resolved
Hide resolved
@EgorBot -arm -amd -intel using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;
BenchmarkSwitcher.FromAssembly(typeof(Bench).Assembly).Run(args);
[MemoryDiagnoser(false)]
public class Bench
{
[Benchmark]
[ArgumentsSource(nameof(GetLists))]
public int SumList(List<int> list)
{
int sum = 0;
foreach (int item in list)
{
sum += item;
}
return sum;
}
[Benchmark]
[ArgumentsSource(nameof(GetLists))]
public int SumEnumerable(IEnumerable<int> list)
{
int sum = 0;
foreach (int item in list)
{
sum += item;
}
return sum;
}
public static IEnumerable<List<int>> GetLists() =>
from count in new int[] { 1, 10, 1_000 }
select Enumerable.Range(0, count).ToList();
} |
This appears to be a way to achieve the desired goal of helping the boxed case and not negatively impacting the non-boxed case. cc: @EgorBo, @AndyAyersMS |
No description provided.