Производительность вычислений у Deedle Frame значительно ниже, чем у Series? - PullRequest
0 голосов
/ 17 октября 2018

В настоящее время я оцениваю Deedle для своего проекта, и в связи с этим я провел несколько элементарных тестов производительности.Я приложил код, который использовал для этого.По сути, он выполняет две операции:

  • создает два кадра данных 1000x10 и умножает их один раз
  • создает два ряда (длина 1000) и умножает их друг на друга 10 раз

Время выполнения этих операций (только расчет, а не генерация) измеряется с помощью StopWatch.Я ожидаю, что время выполнения этих операций будет примерно одинаковым.Однако на моей машине время выполнения для рядов ~ 10 мс, а для фреймов данных - ~ 200 мс, поэтому вычисление с фреймами данных примерно в 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;
        }
    }
}
...