我有一个使用jqPlot的应用程序,我想让它表现更好 - 即让它更快地渲染图表。
使用Firefox分析器,我能够深入了解在代码的各个部分花费的时间,并且我发现对jqplot的调用大约需要85%的时间。在85%中,约有60%用于jqplot.draw例程,约20%用于jqplot.parseOptions例程。
除静态配置数据(图例相关内容,网格相关内容,光标和突出显示内容以及x,y,y1和y2轴信息)外,实际图表数据在选项对象中传递给jqplot。图表数据包括系列数据,系列选项和标签标记。
jqplot将所有这些东西复制到它自己的内存中,它使用一个名为parseOptions的函数来完成它,该函数使用jquery.extend()函数来完成工作。 jquery.extend函数似乎是一个通用的复制函数,它知道如何处理所有数据类型和对象,但是像任何通用函数一样,它没有针对它们中的任何一个进行优化。
我的第一次尝试是尝试在调用jqplot时传递静态选项,然后使用jqplot.replot()将系列数据,系列选项和滴答传递给图表对象(以避免在parseOptions中扩展) 。这失败了,在我追踪代码之后,我发现重新绘制只接受线图数据(x,y点)并且不接受OHLC数据(因为大多数这些图表都是由它组成的)。我接下来尝试在初始调用jqplot时传递OHLC数据并在随后的replot调用中传递系列选项和滴答,但是虽然(有限的)jqplot文档说replot会接受选项,但它不是完整的选项集和我需要的那些都没有处理。
我的下一次尝试是使series_options"更轻"。图表的主要系列数据使用OHLCRenderer,而其他系列使用lineRenderer。当前代码将lineRenderer设置为默认值,每个series_option对象都有一个指定OHLCRenderer的覆盖。 series_option对象中的每个OHLCRenderer覆盖引用都有多个对象 - 函数原型和其他东西。由于与样本/晶圆对象相比,只有少数非样本/晶圆类型,我改变了方法,使OHLCRenderer成为默认值,并将lineRenderer覆盖添加到其他对象。我认为删除这么多对象引用会加快parseOption过程,但它没有明显的差别(如果有的话,它看起来有点慢,但由于分析是如此,它并不清楚)。
我现在没有想法。任何人都有任何想法,我可以做些什么来加快图表渲染?