我有一个使用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过程,但它没有明显的差别(如果有的话,它似乎有点慢,但由于分析是如此当然不清楚) .

我现在已经没有想法了 . 任何人都有任何想法,我可以做些什么来加快图表渲染?