Deedle Frame的计算性能比Series慢得多?

时间:2018-10-17 12:39:14

标签: c# .net-core deedle

我目前正在为我的项目评估Deedle,并为此进行了一些初步的性能测试。我已经附加了我以前执行此操作的代码。基本上,它执行两项操作:

  • 生成两个1000x10数据帧并相互相乘一次
  • 生成两个系列(长度为1000)系列,并将它们彼此相乘10次

这些操作的执行时间(仅计算而不是生成)使用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;
        }
    }
}

0 个答案:

没有答案