【问题标题】:Highchart performance slow on plotting live data绘制实时数据时 Highchart 性能缓慢
【发布时间】:2016-07-06 10:52:39
【问题描述】:

我在 Highchart 的 (4.2.4) 线型图表中为每秒数据绘制实时数据,即 60 点持续 1 分钟。要求是长时间收集每秒数据。我正在使用下面的代码串联添加点。 我拥有的系列数是 20。对于每个系列,我必须每秒添加点。每个系列的 turboThreshold 设置也在 2000 左右。并且切片应该在1000个点之后进行数据。

chart.series[0].addPoint(point, false, data > 1000?shift: false, false);

我看到我的浏览器一直挂起的性能非常低,并且图表在一段时间后非常无响应。我该怎么做才能获得更好的性能?我试过以下东西: 1) 关闭系列动画:

plotOptions: {
                            series: {
                                animation:false,
                                states: {
                                    hover: {
                                        lineWidthPlus: 0
                                    }
                                }
                            }
                        },

2) 关闭动画和重绘添加点到图表

3) 关闭系列标记

4) 在应用程序中包含 boost.js 模块

 script src="https://code.highcharts.com/modules/boost.js"

【问题讨论】:

标签: javascript boost highcharts


【解决方案1】:

如果没有您的实际代码,我只能推测您在做什么,但我的假设是您每次添加一个点时都会尝试重绘图表,即每秒重绘 20 次,这非常过分并且会可能需要超过 1 秒才能完成重绘,这意味着在绘制旧点的同时还会添加新点。在添加点时将重绘设置为 false 并每秒或随机手动重绘。

示例代码:

$(function() {


  var series = function(i) {
    return {
      name: 'Random data '+i,
      data: (function() {
        // generate an array of random data
        var data = [],
          time = (new Date()).getTime(),
          i;

        for (i = -19; i <= 0; i += 1) {
          data.push({
            x: time + i * 1000,
            y: Math.random()
          });
        }
        return data;
      }())
    };
  };

  $(document).ready(function() {
    Highcharts.setOptions({
      global: {
        useUTC: false
      }
    });

    $('#container').highcharts({
      chart: {
        type: 'line',
        animation: Highcharts.svg, // don't animate in old IE
        marginRight: 10,
        events: {
          load: function() {
                        var chart = this;
            // set up the updating of the chart each second            
              setInterval(function() {
                for (var i = 0; i < 20; i++) {              
                var series = chart.series[i];
                var x = (new Date()).getTime(), // current time
                  y = Math.random();
                  series.addPoint([x, y], false, false,false);
                }
                chart.redraw();
              }, 1000);            
          }
        }
      },
      title: {
        text: 'Live random data'
      },
      xAxis: {
        type: 'datetime',
        tickPixelInterval: 150
      },
      yAxis: {
        title: {
          text: 'Value'
        },
        plotLines: [{
          value: 0,
          width: 1,
          color: '#808080'
        }]
      },
      tooltip: {
        formatter: function() {
          return '<b>' + this.series.name + '</b><br/>' +
            Highcharts.dateFormat('%Y-%m-%d %H:%M:%S', this.x) + '<br/>' +
            Highcharts.numberFormat(this.y, 2);
        }
      },
      exporting: {
        enabled: true
      },      
      plotOptions: {
        series: {
            marker: {
            enabled: true
          }
        }
      },
      series: [series(1), series(2),series(3), series(4),series(5), series(6),series(7), series(8),series(9), series(10),series(11), series(12),series(13), series(14),series(15), series(16),series(17), series(18),series(19), series(20)]
    });
  });
});

拨弄http://jsfiddle.net/62k8sryc/1/

注意

因为这是 JavaScript,它在很大程度上取决于浏览器构建/版本和机器规格。

【讨论】:

  • 是的,我正在尝试您在 Fiddle 中所做的相同示例,并且在完成向所有系列添加点后,我正在重新绘制图表。在您创建的小提琴中,唯一的更改是将图表类型更改为 ** line ** 并导出和标记,图例都已打开。我还注意到向单个系列添加点不会影响性能,但对 20 个系列添加点确实会影响。
  • @piu 如果你真的做了一个表明问题的小提琴,它会有所帮助。我已根据您建议的差异更新了代码。我仍然没有看到太大的问题,速度有所放缓,但没有太极端。
  • 感谢 @apokryfos 您所做的更改。如果您长时间运行小提琴,它会挂起浏览器,并且 highchart 也会变得无响应。单击导出菜单需要很长时间。这正是我遇到的问题。只是为了复制更接近我的场景的情况。我有一个小提琴jsfiddle.net/priyankamore/g4qrL7yk 长时间运行这个小提琴,highchart 变得无响应,缩放,导出或任何单击按钮都需要太长时间。除了导出,我还包含 export-csv 模块
  • 也许你应该早点开始移动而不是在 1000 之后。1000 点意味着每秒将有 20 000 点要绘制。让 JavaScript/HTML/SVG 完成这项工作有点繁重,或者您可以随机重绘(例如,每秒有 20% 左右的概率)。可能会弄乱参数。请记住,IE 8 用户运行的渲染器比 SVG 慢得多,因此在这种情况下,即使 1000 点也可能太多
  • 我认为您需要在示例中添加 boost.js 模块并将 boostThreshold 参数更改为较小的值。只有当点数大于 boostThreshold 时,Boost 模块才起作用。请参阅此示例,将 boostThreshold 设置为 1:jsfiddle.net/g4qrL7yk/1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-18
  • 1970-01-01
  • 2012-04-30
  • 2018-03-24
  • 2015-11-09
  • 1970-01-01
相关资源
最近更新 更多