如上图所示的效果反应,用户体验效果非常不好,网络请求10秒以上,图表渲染至少要5秒以上,渲染成功后用户操作卡顿、延迟还特别严重。
但是这并不能说明ECharts图表渲染性能不好,而是有些时候ECharts有提供的方案,但是我们并没有按照官方策略去执行,去优化。图中面对的数据量才是十万级,相比较而言,在目前大数据的时代,百万级、千万级的数据量也会经常出现在我们的日常项目开发中,那么试想一下,如果还是以上这种方式渲染,我相信只有崩溃一条路可以走。
因此,在ECharts图表渲染这种场景下,面对庞大的数据量时,我们应该如何进行优化?提升用户体验呢?接下来我们就聊一下在实际项目中ECharts渲染海量数据的几个优化方案。
随着数据量的增加,直接一次性加载所有数据可能导致页面性能下降和用户体验变差,因此考虑将数据分段加载也是一种常见的性能优化方案。
dataZoom组件提供了几个属性,利用这几个属性可以控制图表渲染时的性能问题,如下所示:
具体方案是使用start和end控制ECharts图表初次渲染时滑块所处的位置以及数据窗口范围,使用minSpan和maxSpan用于限制窗口大小的最小值和最大值,最终限制的图表的可视区域显示范围,如下代码所示:
varoption={dataZoom:[{type:"slider",xAxisIndex:[0],start:0,end:1,minSpan:0,maxSpan:10,},],};以上代码表示ECharts图表初始化时,数据窗口从x轴0~1%范围内显示,最大的窗口显示范围为10%
最终实现效果图如下图所示:
以上的这种方案,优缺点很明显,如下几点总结:
可以很好的解决ECharts首次进行大数据量渲染造成的卡顿体验问题,不需要额外的数据处理,只需要通过简单的配置dataZoom缩放组件就可以实现
ECharts还提供了另一种提高渲染性能的方式,那就是降采样策略series-line.sampling,通过配置sampling采样参数可以告诉ECharts按照哪一种采样策略,可以有效的优化图表的绘制效率。
折线图在数据量远大于像素点时候的降采样策略,开启后可以有效的优化图表的绘制效率,默认关闭,也就是全部绘制不过滤数据点。
sampling属性提供了几个可选值,配置不同的值可以有效的优化图表的绘制效率,如下所示:
sampling的可选值有以下几个:
具体方案是配置series的sampling,最终表示使用的是ECharts的哪一种采样策略,ECharts内部机制实现优化策略:
varoption={series:{type:"line",sampling:"lttb",//最大程度保证采样后线条的趋势,形状和极值。},};以上代码表示使用'lttb'降采样策略,实现降低性能消耗的效果。
通过配置series的sampling为lttb模式,对比之前的曲线,可以最大程度保证采样后线条的趋势,形状和极值,如下图所示:
对比之前的效果,可以说是体验效果有质的飞跃,最终实现效果图如下图所示:
说明:本项目只使用了lttb和minmax这两种采样策略,相对比来说lttb有更流程的性能体验,但是测试中发现在一些情况下,极值出现偏差,也就是最大值最小值显示失误,但是使用minmax正常,原因未排查,如下图所示:
其他的降采样策略并不适合本项目,因此没有进行详细测试,感兴趣的同学可以按需进行研究!
在实际应用中,通过数据分段渲染和官方降采样的实现方案,可以看到在优化渲染海量数据时,它们是有效的策略之一。除了以上介绍的方式外,其实还可以结合数据聚合处理、延迟渲染、硬件加速、WebWorker等多种优化手段,综合运用以实现更高效的海量数据可视化展示。
渲染十万级+的数据量是一个挑战性的任务,但通过合理的优化方案和技巧,可以提升页面性能,改善用户体验,实现数据可视化的更好展示效果。