我目前正在为我的项目评估Deedle,并为此进行了一些初步的性能测试。我已经附加了我以前执行此操作的代码。基本上,它执行两项操作:
这些操作的执行时间(仅计算而不是生成)使用StopWatch进行测量。我希望这些操作的执行时间会有些相似。但是,在我的机器上,序列〜10ms的执行时间和数据帧的执行时间为〜200ms,因此使用数据帧进行计算的速度要慢约20倍。我在.NET Core 2.1,Deedle 2.0.0-beta01,FSharp.Core 4.5.2中运行此程序,在Deedle 1.2.5中也得到了类似的结果。
我在做错什么吗,或者这仅仅是库或其C#接口的问题,还是可能有其他原因?
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Deedle;
namespace DeedleTest
{
class Program
{
static void Main(string[] args)
{
const int countCols = 10;
const int countRows = 1000;
Frame<DateTime, int> df1 = GenerateFrame(countCols, countRows, false);
Frame<DateTime, int> df2 = GenerateFrame(countCols, countRows, false);
var stopwatch = Stopwatch.StartNew();
df1 = df1 * df2;
stopwatch.Stop();
Console.WriteLine(stopwatch.ElapsedMilliseconds);
Series<DateTime, double> ser1 = GenerateSeries(countRows);
Series<DateTime, double> ser2 = GenerateSeries(countRows);
stopwatch.Reset();
stopwatch.Start();
foreach (int i in Enumerable.Range(0, countCols))
{
ser1 = ser1 * ser2;
}
stopwatch.Stop();
Console.WriteLine(stopwatch.ElapsedMilliseconds);
Console.ReadKey();
}
private static Frame<DateTime, int> GenerateFrame(int countCols, int countRows, bool randomNumbers = true)
{
var seriesList = new List<Series<DateTime, double>>();
foreach (int col in Enumerable.Range(0, countCols))
{
Series<DateTime, double> series = GenerateSeries(countRows, randomNumbers ? null : (double?)col);
seriesList.Add(series);
}
return Frame.FromColumns(seriesList);
}
private static Series<DateTime, double> GenerateSeries(int countRows, double? number = null)
{
var randgen = new Random();
var startDate = DateTime.Now;
var builder = new SeriesBuilder<DateTime, double>();
foreach (int row in Enumerable.Range(0, countRows))
{
builder.Add(startDate.AddSeconds(row), number == null ? randgen.NextDouble() : (double)number);
}
return builder.Series;
}
}
}