65.9K
CodeProject 正在变化。 阅读更多。
Home

比较 .NET Web 应用程序图表解决方案

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.88/5 (22投票s)

2014年7月28日

CPOL

7分钟阅读

viewsIcon

66680

downloadIcon

151

本文收集了 .NET 中最流行的免费/商业数据可视化解决方案。

引言

经过 ASP .NET 发布多年后,社区积累了大量用于数据可视化的各种解决方案,以满足任何品味和预算:免费、商业、自开发等。它们都以不同的方式工作,没有可互操作的接口,使用不同的架构、性能和布局。因此,开发人员在寻找最佳选择时,往往停留在第一个或多或少合适的方案上,因为他们没有足够的时间进行完整的调查。

本文试图将所有可用的解决方案集中到一个地方,比较它们的性能,提供简短的摘要,并提供最简单的使用示例。此外,它还介绍了一个快速指南,解释了测试应用程序的技术实现,因为这可能对初学者很有趣。

背景

一段时间前,我被分配了一项任务——重新开发现有的 RDLC 报告图表解决方案,因为它在大量数据下运行太慢。预计新引入的解决方案应与 RDLC 分离,只将图像渲染到文件或流中,以便在其他地方使用。我需要调查现有解决方案并检查它们的速度、灵活性、定制性等。除了速度之外,这些属性中的大多数都无法衡量。因此,在执行任务时,我比较了最流行的免费/商业解决方案的性能,并希望与公众分享结果。

快速概览

技术上,我在固定数量的随机值数据上运行每个解决方案。为了最大程度地减少不准确性,它分多次迭代完成。每个图表的默认设置都没有更改。我承认这可能不是一个完全可靠的方法,但我没有看到其他替代方法。

以下是概述中包含的图表解决方案列表:

为了不浪费您的时间,我将性能测试结果直接呈现在这里:

序号 解决方案 许可证 迭代次数 总时间 (秒) 平均时间 (秒)
1 Zed Graph 免费 10 2.281 0.2281
2 Dislin  免费 10 2.591 0.2591
3 ChartDirector 商业 10 3.604 0.3604
4 NPlot 免费 10 3.846 0.3846
5 Oxy Plot 免费 10 4.091 0.4091
6 Web Chart  免费 10 4.305 0.4305
7 Microsoft Chart Controls 免费 10 4.353 0.4353
8 Chart FX 商业 10 5.3 0.53
9 ILNumerics 商业 10 6.079 0.6079
10 DevExpress 商业 10 7.614 0.7614
11 dotnetCharting 商业 10 7.684 0.7684
12 Tee charts 商业 10 10.004 1.0004
13 Telerik charts 商业 10 11.496 1.1496
14 Infragistic 商业 10 12.113 1.2113
15 Open minded plot 免费 10 13.034 1.3034
16 Google Sharp charting 免费 10 14.12 1.412

测试在配置如下的PC上进行:Intel Core I5 3.10 GHz,8gb 内存,NVIDIA GeForce GT 520,Windows 7 x64。结果可能因您的PC而异。

我尽量不对每个特定解决方案发表个人意见,因为这可能不客观,或者我只是缺乏使用它们的经验。仅提供一般信息。

  • DisLin - 跨平台 (UNIX, Linux, FreeBSD, OpenVMS, Windows, Mac OSX 和 MS-DOS),快速,支持多种语言 (C, C++, Fortran 77, Fortran 90, Perl, Python, Ruby, Tgl, GCL, C#)。
  • Google Chart Sharp - Google Chart API 的 C# 封装。每天限制 50000 次调用。可能因网络带宽而运行缓慢。                                 
  • Microsoft Chart Controls - 微软官方原生图表解决方案。优点是广泛使用且文档完善。                                                      
  • NPlot - 开源。与其他解决方案相比,运行速度相当快。
  • OxyPlot - 跨平台,开源。与其他免费解决方案相比,应用广泛。拥有 WPF、Silverlight、Windows Phone、Windows 8 Metro、Xamarin 的控件。
  • ZedGraph - 最快的解决方案(默认安装)。开源。拥有 ASP .NET 和 Windows Forms 的控件。                                                                                                                               
  • WebChart - 旧且已关闭(据我所知)的解决方案。但仍然稳定,可能对某些人有用。
  • OpenMinded - 我分类中的“黑马”。速度慢且鲜为人知,但外观漂亮。
  • Chart Fx - 商业解决方案。根据文档支持 .NET、Java、HTML5、COM、WPF、Silverlight、Sql Reporting Services。                                                                               
  • DevExpress - 广泛使用的商业解决方案。拥有大量控件。支持 WinForms、ASP.NET、ASP MVC、WPF、Windows Forms、Silverlight、Windows 8。唯一的问题是,我无法将 Web 图表渲染成图像,所以我使用了 WinForms 控件。其运行速度比大多数其他解决方案慢。                              
  • Telerik - 另一个广泛使用的商业解决方案,拥有大量用于跨平台开发的各种控件。使用不同的技术,是最慢的解决方案之一。
  • Chart director - 快速的商业解决方案。支持 .NET、Java、ASP、COM、VB、PHP、Perl、Python、Ruby、ColdFusion、C++。                                        
  • ILNumerics - 专为 .NET 开发的数学库。商业版。性能中等。
  • Tee chart - 商业解决方案。支持 Java、ActiveX / COM、PHP 和 Delphi VCL / FireMonkey。性能低于平均水平。                                        
  • dotnetCharting - 商业解决方案。拥有易于编程的界面和丰富的功能。              
  • Infragistics - 商业解决方案。美观易用,但相对较慢。

如您所见,免费解决方案通常比其商业竞争对手运行更快,但可能具有较少的自定义参数,并且当然没有官方支持。

实现细节

我的目标是将每个图表解决方案的实现隐藏在某个抽象实体之下,这样我就可以通过编程方式测量性能。此外,由于我无法因许可证而发布商业解决方案,我需要一种架构,让我可以动态地将它们包含在项目中。

通过将每个图表解决方案的“适配器”分离到单独的程序集中,实现了这一目标。通常,组件图如下所示:

所有基类和接口都引入到 ChartingCore.dll 程序集中,以使 Web 应用程序和特定适配器能够共享代码。它包含以下接口(和相应的基类)的定义:

    public interface IChartFactory
    {
        IChartAdapter GenerateChart(ChartParameters parameters);
        string ChartTypeName { get; }
        string DownloadLink { get; }
        SolutionType SolutionType { get; }
        Guid Id { get; }
    }
    public interface IChartAdapter
    {
        Image CreateChartImage();
        IChartFactory Owner { get; set; }
    }
    public enum SolutionType
    {
        Free,
        Commercial,
        Any
    }

然后,每个解决方案的每个程序集都必须实现这些接口。例如,就像为 Google Chart Sharp 所做的那样。

    /// <summary>
    /// Apache License 2.0
    /// Official link - https://code.google.com/p/googlechartsharp/
    /// </summary>
    public class GoogleSharpAdapter : BaseChartAdapter
    {
        public GoogleSharpAdapter(ChartParameters parameters)
            : base(parameters)
        {
        }

        protected override Image DoCreateChartImage()
        {
            var chart = new LineChart(Parameters.ChartWidth, Parameters.ChartHeight);
            chart.SetData(Parameters.SeriaData.Select(t => new float[]{t.Key, t.Value}).ToList());
            var webClient = new WebClient();
            byte[] imageBytes = webClient.DownloadData(chart.GetUrl());
            return new Bitmap(new MemoryStream(imageBytes));
        }
    }
    /// <summary>
    /// Open Source https://code.google.com/p/googlechartsharp/
    /// </summary>
    public class GoogleSharpChartFactory: BaseChartFactory
    {
        protected override IChartAdapter DoGenerateChart(ChartParameters parameters)
        {
            return new GoogleSharpAdapter(parameters);
        }

        public override string ChartTypeName
        {
            get { return "Google Sharp charting"; }
        }

        public override string DownloadLink
        {
            get { return "https://code.google.com/p/googlechartsharp/"; }
        }

        public override SolutionType SolutionType
        {
            get { return SolutionType.Free; }
        }
    }

然后我使用 Spring Framework for .NET 动态加载程序集到 Web 应用程序中。在这个应用程序中,关于所需程序集和类的信息位于 SpringContext.xml 文件中。

<?xml version="1.0" encoding="utf-8" ?>
<objects xmlns="http://www.springframework.net">
    <object name="CurrentFactoriesCollection" type="FreeChartTools.FactoriesCollection, FreeChartTools, Version=1.0.0.0, Culture=neutral">
        <constructor-arg>
            <list element-type="ChartingCore.IChartFactory, ChartingCore, Version=1.0.0.0, Culture=neutral">
                <!--Free && Open source solutions-->
                <ref object="DisLinChartingFactory"/>
                <ref object="GoogleSharpChartingFactory"/>
                <ref object="MsChartingFactory"/>
                <ref object="NPlotChartFactory"/>
                <ref object="OxyPlotChartFactory"/>
                <ref object="WebChartControlFactory"/>
                <ref object="ZedGraphChartFactory"/>
                <ref object="OpenMindedPlotFactory"/>

                <!--Commercial && Proprietary solutions-->
                <ref object="ChartFxFactory"/>
                <ref object="DevExpressFactory"/>
                <ref object="TelerikFactory"/>
                <ref object="TeeChartFactory"/>
                <ref object="ChartDirectorFactory"/>
                <ref object="ILNumericsFactory"/>
                <ref object="DotnetChartFactory"/>
            </list>
        </constructor-arg>
    </object>
    
    <!--Free && Open source solutions-->
    <object name="DisLinChartingFactory" type="FreeChartTools.FreeCharting.DisLinCharting.DislinChartFactory, FreeChartTools, Version=1.0.0.0, Culture=neutral" singleton="false" />
.............................................
    
    <!--Commercial && Proprietary solutions-->
    <object name="ChartFxFactory" type="ChartFXCharting.ChartFxFactory, ChartFXCharting, Version=1.0.0.0, Culture=neutral" singleton="false" />
..............................................

如前所述,所有免费程序集都包含在解决方案中。但是由于我不能对商业解决方案也这样做,所以如果您尝试渲染某些未安装在您电脑上的商业解决方案,您可能会在用户界面上看到以下图像:

如果您想测试商业解决方案,您必须从相应的链接下载它们(我为每个解决方案提供了链接并在用户界面上显示了它们)。

您可以在您的 PC 上测试每个解决方案,或比较所有图表的性能。用户界面非常简单。

  1. 您可以对一个选定的解决方案运行测试(例如,您希望立即对某个吸引人的解决方案进行试运行,修改现有代码)。选择解决方案并按下“检查”按钮。
  2. 您可以根据需要配置每个解决方案,并比较您感兴趣的参数的性能。选择测试迭代次数,然后按下“比较所有解决方案”。

如果我遗漏了某些可在 .NET 中使用的有趣图表解决方案,请告诉我,我会尽快将其包含在内。或者,由于此项目也在 GitHub 上可用 (https://github.com/perevernihata/DotNetChartingOverview),您可以自行进行这些更改。

历史

14年7月30日 - 在文章和源代码中引入了 dotnetCharting 解决方案。

14年8月4日 - 在文章和源代码中引入了 Infragistics 解决方案。所有图片托管在 CodeProject 服务器上。

© . All rights reserved.