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






4.88/5 (22投票s)
本文收集了 .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 上测试每个解决方案,或比较所有图表的性能。用户界面非常简单。
- 您可以对一个选定的解决方案运行测试(例如,您希望立即对某个吸引人的解决方案进行试运行,修改现有代码)。选择解决方案并按下“检查”按钮。
- 您可以根据需要配置每个解决方案,并比较您感兴趣的参数的性能。选择测试迭代次数,然后按下“比较所有解决方案”。
如果我遗漏了某些可在 .NET 中使用的有趣图表解决方案,请告诉我,我会尽快将其包含在内。或者,由于此项目也在 GitHub 上可用 (https://github.com/perevernihata/DotNetChartingOverview),您可以自行进行这些更改。
历史
14年7月30日 - 在文章和源代码中引入了 dotnetCharting 解决方案。
14年8月4日 - 在文章和源代码中引入了 Infragistics 解决方案。所有图片托管在 CodeProject 服务器上。