您的基准并没有真正测量 FLOPS,它在 C# 中执行一些浮点运算和循环。
但是,如果您可以将代码隔离为仅重复浮点操作,您仍然会遇到一些问题。
您的代码应包含一些“预循环”以允许“抖动预热”,因此您无需测量编译时间。
那么,即使你这样做,
您需要在发布模式下编译并进行优化,并在已知一致的平台上从命令行执行您的测试。
在这里提琴
这是我的替代基准,
using System;
using System.Linq;
using System.Diagnostics;
class Program
{
static void Main()
{
const int Flops = 10000000;
var random = new Random();
var output = Enumerable.Range(0, Flops)
.Select(i => random.NextDouble())
.ToArray();
var left = Enumerable.Range(0, Flops)
.Select(i => random.NextDouble())
.ToArray();
var right = Enumerable.Range(0, Flops)
.Select(i => random.NextDouble())
.ToArray();
var timer = Stopwatch.StartNew();
for (var i = 0; i < Flops - 1; i++)
{
unchecked
{
output[i] += left[i] * right[i];
}
}
timer.Stop();
for (var i = 0; i < Flops - 1; i++)
{
output[i] = random.NextDouble();
}
timer = Stopwatch.StartNew();
for (var i = 0; i < Flops - 1; i++)
{
unchecked
{
output[i] += left[i] * right[i];
}
}
timer.Stop();
Console.WriteLine("ms: {0}", timer.ElapsedMilliseconds);
Console.WriteLine(
"MFLOPS: {0}",
(double)Flops / timer.ElapsedMilliseconds / 1000.0);
}
}
在我的虚拟机上,我得到如下结果
ms: 73
MFLOPS: 136.986301...
请注意,我必须显着增加操作次数才能超过 1 毫秒。