我正在将重复的算术代码移入可重用的函数块中,但当我运行一个简单的测试来检测是否会更慢时,我惊讶地发现它比原来慢了两倍。
为什么评估表达式会变慢两倍?
using System;
using System.Runtime.CompilerServices;
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Exporters;
using BenchmarkDotNet.Loggers;
using BenchmarkDotNet.Running;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
var summary = BenchmarkRunner.Run<Calculations>();
var logger = ConsoleLogger.Default;
MarkdownExporter.Console.ExportToLog(summary, logger);
Console.WriteLine(summary);
}
}
public class Calculations
{
public Random RandomGeneration = new Random();
[Benchmark]
public void CalculateNormal()
{
var s = RandomGeneration.Next() * RandomGeneration.Next();
}
[Benchmark]
public void CalculateUsingFunc()
{
Calculate(() => RandomGeneration.Next() * RandomGeneration.Next());
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public int Calculate(Func<int> expr)
{
return expr();
}
}
}
CalculateNormal
更快,您能否向我们解释为什么不只使用CalculateNormal
(或等效函数)? - mjwillsusing
指令 - 我现在已经添加了它们,但如果您一开始就包含它们,那会节省我几分钟的时间。 - Jon Skeet