1

我正在使用 C# 和 VisualStudio 开发 WindowsForm。该程序启动一个在 Matlab 中完成的 .exe,在这个 .exe 完成后,它会在几个 .mat 文件中生成大量数据,我必须将这些数据绘制在图表中(不是同时)。用户选择这个“信号”中的 1 个,它必须被绘制。

根据配置的不同,每个信号的值可以从 ~10.000 到 ~500.000,当我用这些数据量绘制信号时,图表控件的响应不流畅,放大/缩小也需要很长时间。当同时绘制更多信号时,控制变得更加不稳定。

另一方面,如果我绘制来自 Matlab 本身的信号,则几乎可以立即完成这项工作。缩放效果完美,您可以根据需要绘制尽可能多的信号,因为性能保持不变。

为什么 Matlab 和 C# 之间存在如此大的性能差异?

我可以做些什么来提高 C# 性能?

编辑:我使用 VisualStudio 提供的标准图表控件。

4

2 回答 2

0

你没有说你正在使用什么图表控件,但它肯定不是为大型数据集设计的。为您的绘图使用基于 OpenGL 的东西。

以我的经验,我对超过 3000 万个数据点的 Matlab 平移和缩放性能不佳感到非常恼火,而 C#+OpenGL 实现的帧速率高出 10 倍。

(除其他原因外,MatLab 似乎完全无法剔除远离屏幕的数据集部分——例如,如果你有一个单调递增的时间轴,这是一个非常简单的优化,可以获得巨大的好处)

于 2013-04-22T14:54:15.357 回答
0

你得到的数据比代表它的像素多。听起来您的图表控件正在采用蛮力方法:绘制每个数据点,即使控件上每列像素有 1000 个数据点。

无论您是否可以访问图表控件的源代码,解决方案都是一样的:您必须减少绘图调用的数量。您需要将数据过滤到更易于管理的大小。在折线图的情况下,如果您的控件是 500 像素宽,那么它不应该尝试绘制超过 500 条线。

如果您可以访问图表控件的代码,那么您可以让它在内部减少数据集。否则,您需要在外部管理数据集的抽象视图,并将视图而不是完整数据集传递到图表控件中。当用户更改缩放级别等时,视图将需要更新......不幸的是,取决于底层图表控件是否知道自动将数据集裁剪为可见的内容,平移可能有点难以实现。每当用户平移视图时,您都需要自己执行剪辑,但还需要在每个轴的末端包含数据点,以便滚动条保持一致。

首先确保原始数据集按 X 轴值排序,从而让自己更轻松。排序只需要进行一次,然后您就可以相对快速地构建任意缩放级别的视图。AO(log N) 搜索可以识别可见范围开始和结束处的索引,从那里提取 X 个样本以供您查看是微不足道的。如果已知原始数据是在 X 轴上以固定间隔获取的,那么您甚至不需要 O(log N) 搜索;您可以直接计算可视范围的索引。

于 2013-04-22T15:55:46.987 回答