在绘制实时数据时,Highchart性能会变慢

时间:2016-07-06 10:52:40

标签: javascript boost highcharts

我正在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)关闭动画并重新绘制地图上的addpoint

3)关闭系列标记

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

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

1 个答案:

答案 0 :(得分:0)

如果没有你的实际代码,我只能推测你正在做什么,但我的假设是你每次添加一个点时都试图重绘图表,这将是每秒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,所以它在很大程度上取决于浏览器构建/版本和机器规格。