I've got code for test on BenchmarkDotnet..
And then I found that something felt wrong..
My projects version is
C# 11.0 .NET 7.0 Nuget Package BenchMarkDotnet 0.13.5
ReadOnlyMemory<float> readOnlyFloats;
ReadOnlyMemory<double> readOnlyDoubles;
[GlobalSetup]
public void Setup()
{
var rand = new Random();
var floats = Enumerable.Range(0, ArrayLength).Select(a => rand.NextSingle()).ToArray();
var doubles = Enumerable.Range(0, ArrayLength).Select(a => rand.NextDouble()).ToArray();
readOnlyFloats = floats;
readOnlyDoubles = doubles;
}
[Benchmark]
public double Calc_WaveStatistic_Sum()
{
return readOnlyFloats.Span.Sum();
}
[Benchmark]
public double Calc_WaveStatistic_Sum_Double()
{
return readOnlyDoubles.Span.Sum();
}
[Benchmark]
public double Calc_WaveStatistic_Avg()
{
return readOnlyFloats.Span.Avg();
}
[Benchmark]
public double Calc_WaveStatistic_Avg_Double()
{
return readOnlyDoubles.Span.Avg();
}
and the extend method goes to
public static double Sum(this ReadOnlySpan<float> values)
{
double sum = 0;
for (int i = 0; i < values.Length; i++)
sum += values[i];
return sum;
}
public static double Sum(this ReadOnlySpan<double> values)
{
double sum = 0;
for (int i = 0; i < values.Length; i++)
sum += values[i];
return sum;
}
public static double Avg(this ReadOnlySpan<float> values)
{
return values.Sum() / values.Length;
}
public static double Avg(this ReadOnlySpan<double> values)
{
return values.Sum() / values.Length;
}
For this code, I expect the Sum()
method to be faster than Avg()
but result is
Avg() is excuting an extra calculation after the Sum() (divide by length).
So is my result right?
If it's right, why is it faster?