Improve highcharts performance for large amounts of data

前端 未结 7 1164
名媛妹妹
名媛妹妹 2021-02-02 01:38

I am trying to get a larger amount of data. Sample data is below

1850/01   -0.845   -0.922   -0.748   -1.038   -0.652   -1.379   -0.311   -1.053   -0.636   -1.41         


        
7条回答
  •  梦毁少年i
    2021-02-02 01:52

    Given the data you are displaying is not updating once a month, I feel like generating the chart for every view is a big waste of resources for your clients.

    Indeed, it would be pretty easy for you to generate the chart without changing anything that you are doing now, but then extracting the resulting SVG and serving it simply to your visitors.

    For that you simply have to use the getSVG method of HighCharts, that will return the SVG in a stringified form.

    I don't really know if you want to have some sort of process to auto update the chart, but you could use a cron job for this purpose. Keep in mind that you would have to do something anyway even with your initial approach to update the data.


    Regarding your script, first thing to notice is that you are using $.each, which is pretty bad in term of performance comparing to the vanilla equivalents. As demonstrated by this jsPerf, I get 3,649 Op/s with $.each whereas for loops could get you up to 202,755 Op/s which is insanely faster! Since you also doing a double loop, the difference would be ^2.

    But again, since the data is not updated often, this part of the script could be removed entirely and converted into a JSON corresponding to the output of the function, that HighCharts could load directly, skipping the entire processing and transformation of your CSV.


    If using HighCharts is not a requirement, you could use react-vis, which is a collection of React components focused around Data Visualization. It's build as an api on top of SVG, .

    I've made a demo that you can checkout on CodePen with the same data as you to plot the monthly temperatures since 1850.

    const {
      HorizontalGridLines,
      XAxis,
      XYPlot,
      YAxis,
      LineMarkSeries,
    } = reactVis
    
    const color = d3.scaleLinear()
      .domain([1850, 2017])
      .range(['yellow', 'red'])
    
    const Chart = () => (
      
        
        
        
        {Object.keys(data).map(key => (
          
        ))}
      
    )
    
    ReactDOM.render(, document.querySelector('#root'))
    

    I also use the scaleLinear method of d3 to see the change over the years since I thought it would be an interesting information to show, but it can be changed depending of your needs.

    It's using SVGs, but we are also working on integration with webgl by the intermediary of deck.gl which would allow for even more optimizations gains, still not ready yet and I'm not sure you would really need that much, but worth noting.

    Disclaimer: I currently work for Uber, which made deck.gl and react-vis.

提交回复
热议问题