C# Deedle机架的计算性能明显低于Series?

C# Deedle机架的计算性能明显低于Series?,c#,.net-core,deedle,C#,.net Core,Deedle,我目前正在为我的项目评估Deedle,关于这一点,我已经做了一些基本的性能测试。我附上了我用来做这件事的代码。基本上它做两个操作: 生成两个1000x10数据帧并相乘一次 生成两个系列(长度1000)系列,并将它们相乘10倍 使用秒表测量这些操作的执行时间(仅计算,不生成)。我希望这些操作的执行时间会有点类似。但是,在我的机器上,序列的执行时间约为10ms,数据帧的执行时间约为200ms,因此使用数据帧进行计算的速度要慢20倍。我在.NET Core 2.1、Deedle 2.0.0-bet

我目前正在为我的项目评估Deedle,关于这一点,我已经做了一些基本的性能测试。我附上了我用来做这件事的代码。基本上它做两个操作:

  • 生成两个1000x10数据帧并相乘一次
  • 生成两个系列(长度1000)系列,并将它们相乘10倍
使用秒表测量这些操作的执行时间(仅计算,不生成)。我希望这些操作的执行时间会有点类似。但是,在我的机器上,序列的执行时间约为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;
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用系统诊断;
利用制度全球化;
使用System.IO;
使用System.Linq;
使用System.Threading.Tasks;
使用Deedle;
名称空间DeedleTest
{
班级计划
{
静态void Main(字符串[]参数)
{
常数int countCols=10;
const int countRows=1000;
帧df1=generateName(countCols、countRows、false);
帧df2=generateName(countCols、countRows、false);
var stopwatch=stopwatch.StartNew();
df1=df1*df2;
秒表;
控制台写入线(秒表延时百万秒);
ser1系列=发电机系列(countRows);
ser2系列=发电机系列(countRows);
秒表复位();
秒表。开始();
foreach(可枚举范围(0,countCols)中的int i)
{
ser1=ser1*ser2;
}
秒表;
控制台写入线(秒表延时百万秒);
Console.ReadKey();
}
私有静态帧生成器名称(int countCols、int countRows、bool randomNumbers=true)
{
var seriesList=新列表();
foreach(可枚举范围中的整数列(0,countCols))
{
系列=生成系列(计数行,随机数?空:(双?)列);
系列列表。添加(系列);
}
返回Frame.FromColumns(seriesList);
}
专用静态系列生成器(int countRows,double?number=null)
{
var randgen=新随机数();
var startDate=DateTime.Now;
var builder=new SeriesBuilder();
foreach(可枚举范围中的int行(0,countRows))
{
Add(startDate.AddSeconds(行),number==null?randgen.NextDouble():(双精度)number);
}
返回生成器.Series;
}
}
}