1

我已经看到了一些类似的问题,我制作了一个适合我的系统,但我需要优化它,因为这个程序本身就占用了大量的 CPU 负载。

这正是问题所在。

我有一个需要实时绘制的传入信号/数据流。我只希望一次显示有限数量的点(比如 1024 个点),所以我将沿 y 轴的数据点与 x 轴上 0-1024 的索引进行对比。传入数据的值范围为 0-1023。

我目前所做的(这一切都在 C++ 中)是我将数据放入一个循环循环中,并且每次更新数据时(或每第二个/第三个数据点),我写出一个文件并使用管道,我用 gnuplot 绘制该文件中的数据。

虽然这几乎可以完美运行,但它会导致相当多的负载(根据输入数据速率,我看到我的 Core 2 Duo 的两个内核的使用率甚至达到了 70%)。我需要在这个简短的程序中运行一些处理器密集型代码,所以我觉得几乎有必要对其进行优化。

我希望可以做的是:我可以只绘制当前图和新数据之间的差异(或者绘制每个点而不重新绘制整个图,以便删除该 x 索引处的旧项目) .

我在图表上有固定数量的点,所以重新绘制不起作用。我希望删除该 x 位置的旧点。

4

2 回答 2

1

不幸的是,你想要完成的事情无法完成。您可以将数据文件标记为volatile或使用refresh关键字,但这些只会更新绘图而不重新读取数据。您想重新读取数据,然后只更新差异。

不过,有几件事可能会有所帮助。1)您的眼睛每秒只能记录约 26 帧。所以,如果你有办法确保每秒只向 gnuplot 发送 26 次数据,那可能会有所帮助。2)你是如何编写数据文件的?你是转储为ASCII还是二进制?进行二进制转储可能会更快(对于写入和 gnuplot 读取)。你必须进行实验。

有一种技巧可能不会使您的脚本运行得更快,但是您可以尝试一下(如果您知道要设置的合理yrange,并且正在使用点来绘制数据)...

#set up code:
set style line 1 lc rgb "blue"
set xrange [0:1023]
set yrange [0:1]
plot NaN notitle #Only need to do this once.
for [i=0:1023] set label i+1 at i,0 point ls 1  #Labels must have tags > 0 :-(

#this part gets repeated by your C code.
#you could move a few points at a time to make it more responsive.
set label 401 at 400,0.8              #move point number 400 to a different y value
refresh                               #show it at it's new location.
于 2012-07-12T02:04:51.293 回答
1

您可以使用 gnuplot 进行数据动态绘图,如他们的FAQ中所述,使用该reread功能。它似乎以相当低的负载运行,并在到达末尾时自动滚动图形。为了在低负载下运行,我发现我必须; sleep 1在 awk 命令之后添加一个(在他们的示例文件 dyn-ping-loop.gp 中),否则它会在 awk 处理上循环花费太多 CPU。

于 2015-05-08T16:07:38.870 回答