掌桥专利:专业的专利平台
掌桥专利
首页

数据处理方法、装置、电子设备及计算机存储介质

文献发布时间:2023-06-19 11:52:33


数据处理方法、装置、电子设备及计算机存储介质

技术领域

本发明实施例涉及计算机技术领域,尤其涉及一种数据处理方法、装置、电子设备及计算机存储介质。

背景技术

随着科技的不断进步,人们使用电子设备的频率越来越高。这种情况下,电子设备的响应时间的长短就成为了影响用户使用体验的至关重要的因素。用户与电子设备进行交互时,通常是通过显示屏幕显示信息以进行交互,那么,电子设备显示信息的时间过长,就会造成用户使用体验不好。

现有技术中,在显示数据的过程中,如果待显示数据中包含脚本(如 JavaScript代码),则通常需要使用相应的脚本引擎(如V8引擎)进行解析(Parse)、编译(Complie)、运行(Run)、优化(Optimize)以及内存回收GC(Garbge Collection)等操作,之后采用显示。这一过程导致显示耗时长,进而导致用户等待时间较长。

发明内容

有鉴于此,本发明实施例提供一种数据处理方案,以解决上述部分或全部问题。

根据本发明实施例的第一方面,提供了一种数据处理方法,包括:在执行脚本前,预先加载根据脚本的源代码生成的第一编译数据至缓存中;响应于脚本的执行指令,确定所述脚本中与所述执行指令相匹配的待执行源代码,并从所述第一编译数据中获取与所述待执行源代码对应的第二编译数据;将所述第二编译数据发送至脚本引擎,以获得所述脚本引擎运行所述第二编译数据的运行结果。

根据本发明实施例的第二方面,提供了一种数据处理方法,包括:根据接收到的携带有脚本的显示请求,调用脚本处理组件对所述脚本进行处理,其中,所述脚本处理组件在执行脚本前,预先加载根据脚本的源代码生成的第一编译数据至缓存中,在接收到脚本的执行指令时,确定所述脚本中与所述执行指令相匹配的待执行源代码,并从所述第一编译数据中获取与所述待执行源代码对应的第二编译数据;使用脚本引擎运行所述第二编译数据,并获得运行结果;根据所述脚本处理组件的运行结果进行显示。

根据本发明实施例的第三方面,提供了一种数据处理装置,包括:预加载模块,用于在执行脚本前,预先加载根据脚本的源代码生成的第一编译数据至缓存中;获取模块,用于响应于脚本的执行指令,确定所述脚本中与所述执行指令相匹配的待执行源代码,并从所述第一编译数据中获取与所述待执行源代码对应的第二编译数据;发送模块,用于将所述第二编译数据发送至脚本引擎,以获取所述脚本引擎运行所述第二编译数据的运行结果。

根据本发明实施例的第四方面,提供了一种数据处理装置,包括:请求调用模块,用于根据接收到的携带有脚本的显示请求,调用脚本处理组件对所述脚本进行处理,其中,所述脚本处理组件在执行脚本前,预先加载根据脚本的源代码生成的第一编译数据至缓存中,在接收到脚本的执行指令时,确定所述脚本中与所述执行指令相匹配的待执行源代码,并从所述第一编译数据中获取与所述待执行源代码对应的第二编译数据;使用脚本引擎运行所述第二编译数据,并获得运行结果;页面显示模块,用于根据所述脚本处理组件的运行结果进行显示。

根据本发明实施例的第五方面,提供了一种电子设备,包括:处理器、存储器、通信接口和通信总线,所述处理器、所述存储器和所述通信接口通过所述通信总线完成相互间的通信;所述存储器用于存放至少一可执行指令,所述可执行指令使所述处理器执行如第一方面或第三方面所述的数据处理方法对应的操作。

根据本发明实施例的第六方面,提供了一种计算机存储介质,其上存储有计算机程序,该程序被处理器执行时实现如第一方面或第三方面所述的数据处理方法。

根据本发明实施例提供的数据处理方案,由于在执行脚本之前加载第一编译数据,因而不会占用执行脚本的时间,使得用户感知执行脚本的时间减少,这样就缩短了执行脚本的时间,实现了使网页显示速度加快的效果。此外,在执行脚本时发送至脚本引擎的是编译数据,使得脚本引擎可以省略解析操作和编译操作,运行脚本的速度加快,内核获取运行结果的速度加快,从而执行脚本的时间减少,用户等待时间减少。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明实施例中记载的一些实施例,对于本领域普通技术人员来讲,还可以根据这些附图获得其他的附图。

图1a为根据本发明实施例一的一种数据处理方法的步骤流程图;

图1b为根据本发明实施例一的一种使用场景中数据处理方法的示意图;

图2a为根据本发明实施例二的一种数据处理方法的步骤流程图;

图2b为根据本发明实施例二的一种预先编译源代码的示意图;

图3a为根据本发明实施例三的一种数据处理方法的步骤流程图;

图3b为根据本发明实施例三的一种预先编译源代码并使用编译数据显示网页的示意图;

图3c为根据本发明实施例三的使用场景中进行预编译和基于预编译结果进行网页显示的信令交互示意图;

图3d为现有技术中网页首次显示时的流程示意图;

图3e为现有技术中网页非首次显示时的流程示意图;

图4为根据本发明实施例四的一种数据处理装置的步骤流程示意图;

图5为根据本发明实施例五的一种数据处理装置的结构框图;

图6为根据本发明实施例六的一种数据处理装置的结构框图;

图7为根据本发明实施例七的一种电子设备的结构示意图。

具体实施方式

为了使本领域的人员更好地理解本发明实施例中的技术方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅是本发明实施例一部分实施例,而不是全部的实施例。基于本发明实施例中的实施例,本领域普通技术人员所获得的所有其他实施例,都应当属于本发明实施例保护的范围。

下面结合本发明实施例附图进一步说明本发明实施例具体实现。

实施例一

参照图1a,示出了根据本发明实施例一的一种数据处理方法的步骤流程图。

在本实施例中,以终端设备为执行主体,对数据处理方法进行说明。当然,在其他实施例中,也可以以服务端(服务端包括服务器或云端)作为执行主体。本实施例的数据处理方法包括以下步骤:

步骤S102:在执行脚本前,预先加载根据脚本的源代码生成的第一编译数据至缓存中。

在本实施例中,该方法可以应用于任何需要进行脚本处理的电子设备(例如,终端设备或服务端),终端设备可以为移动终端(手机、PAD等)或个人电脑等。

在本实施例中,以通过移动终端或个人电脑等终端设备的浏览器二次浏览网页为例进行说明,可以理解的本方法并不限于浏览器,其还可以应用至任何需要进行脚本处理的应用程序(如web应用)或者是应用于操作系统中进行脚本处理时。

在通过浏览器二次浏览网页时,在浏览器内核(如浏览器内核中的 render进程)执行脚本之前,浏览器内核从存储有第一编译数据的存储空间中读取第一编译数据到缓存中,以备后续执行脚本时使用。

由于将加载第一编译数据的动作由在现有技术中的在执行脚本过程中加载,调整成了在执行脚本之前加载,使得预先加载第一编译数据的过程可以不占用执行脚本的时间,从而避免了现有技术中执行脚本的用时较长,使得用户需要等待的时间较长,用户体验不好的问题。

其中,脚本可以是网页数据中包含的JavaScript脚本或者其他应用程序中需要处理的脚本,该脚本对应的代码即为源代码。由脚本的源代码生成的第一编译数据包括:通过脚本引擎(例如处理JavaScript的V8引擎)对脚本的部分或全部源代码进行编译后的数据,但不限于此,还可以包括编译数据与源代码的对应关系。在一种可行方式中,第一编译数据可以是对脚本的源代码进行编译后针对编译结果进行序列化操作后获得的序列化后的编译数据。

步骤S104:响应于脚本的执行指令,确定所述脚本中与所述执行指令相匹配的待执行源代码,并从所述第一编译数据中获取与所述待执行源代码对应的第二编译数据。

接收到指示执行脚本的执行指令时,响应于该执行指令,以浏览器为例,浏览器内核中的render进程确定待执行源代码,也就是执行指令对应的业务逻辑涉及的源代码。之后,从已加载的第一编译数据中确定出与待执行源代码对应的第二编译数据。

例如,可以根据源代码与编译数据的对应关系,确定第一编译数据中与待执行源代码匹配的编译数据作为第二编译数据。这样就可以在后续步骤中由脚本引擎直接对第二编译数据进行处理,从而省略解析操作和编译操作,进而进一步减少执行脚本的用时。

步骤S106:将所述第二编译数据发送至脚本引擎,以根据所述脚本引擎运行所述第二编译数据的运行结果进行显示。

在获取到第二编译数据后,将第二编译数据发送给脚本引擎,由其对第二编译数据进行需要的操作。由于脚本引擎获得的已经是编译数据,因而可以省略掉现有技术中解析操作和编译操作,直接对第二编译数据进行运行操作等操作,获得运行结果并返回给浏览器内核。

这样脚本引擎运行脚本的速度提升,返回给浏览器内核运行结果的时间减少,浏览器内核可以根据运行结果进行显示。这样浏览器内核执行脚本所用时间相应减少,从而实现了浏览器内核执行脚本的速度提升,用户等待时间减少的效果。

在一具体实现中,由于第二编译数据来源于第一编译数据,因此第二编译数据同样可以是序列化后的编译数据,则步骤S106可以实现为:将所述第二编译数据发送至脚本引擎,并指示所述脚本引擎对所述第二编译数据进行反序列化操作;根据所述脚本引擎对反序列化操作后的第二编译数据的运行结果,以根据运行结果进行显示。

下面以进行数据显示的使用场景为例,对上述数据处理方法的实现过程进行说明如下:

预先使用脚本引擎对脚本进行解析操作、编译操作和序列化操作,生成便于存储于磁盘中的序列化的编译数据。为了后续能够快速地获得需要的序列化的编译数据,还存储编译数据与源代码之间的对应关系。

本使用场景中的数据处理过程如图1b所示,在数据显示时,在执行脚本之前(以浏览器为例,可以是浏览器内核中的Render进程被创建后),就预先从磁盘中读取出部分或全部的序列化的编译数据,并存储至缓存中,即第一编译数据。图1b中示意为数据处理进程(下面以浏览器的render进程为例)在t0时刻向磁盘发送加载请求,以请求加载第一编译数据。在Render 进程从磁盘获得第一编译数据后先将其存储至缓存中。然后,在t1时刻,Render进程接收到脚本的执行指令,则可根据对该执行指令的解析结果确定待执行的源代码,并从缓存中直接获得与该源代码对应的第二编译数据,该第二编译数据可以为第一编译数据的部分或全部。进而,Render进程将第二编译数据交给脚本引擎(如V8引擎)运行,并从脚本引擎处获得运行结果,并且,基于该运行结果指示进行显示。其中,上述t0时刻早于t1时刻。

上述过程中,由于第二编译数据是序列化后的编译数据,所以脚本引擎只要对其进行反序列化操作就可以获得编译数据,从而省略掉解析操作和编译操作,之后运行获得的编译数据,获得运行结果,后续根据运行结果进行显示(以浏览器为例,可以将运行结果返回给浏览器内核,由浏览器内核根据运行结果进行显示)。

在上述过程中,将加载第一编译数据的过程由现有技术中的在脚本执行期间通过IPC方式从磁盘读取数据至缓存中,优化成了在脚本执行之前预先加载,使得加载第一编译数据不再占用脚本执行时间,脚本执行用时不再受磁盘I/O影响,充分保证了执行脚本的速度,节省了脚本执行期间的耗时,带来直接的用户体验提升。

此外,在通过脚本引擎运行第二编译数据时,省去了解析操作和编译操作,直接运行反序列化操作获得的编译数据就可以获得需要的运行结果,进一步节省了时间,极大地缩短了执行脚本的耗时。

通过本实施例,由于在执行脚本之前加载第一编译数据,因而不会占用执行脚本的时间,使得用户感知执行脚本的时间减少,这样就缩短了执行脚本的时间,实现了使显示速度加快的效果。此外,在执行脚本时发送至脚本引擎的是编译数据,使得脚本引擎可以省略解析操作和编译操作,运行脚本的速度加快,从而执行脚本的时间减少,用户等待时间减少。

需要说明的是,在本实施例中,该数据处理方法主要以应用在浏览器根据网页数据进行网页显示的过程中。当然,在其他实施例中,该数据处理方法可以应用到web应用显示界面的过程中,或者其还可以应用到操作系统等任何适当的场景中。

本实施例的数据处理方法可以由任意适当的具有数据处理能力的电子设备执行,包括但不限于:服务器、移动终端(如平板电脑、手机等)和PC 机等。

实施例二

参照图2a,示出了根据本发明实施例二的一种数据处理方法的步骤流程图。在本实施例中,主要对数据处理过程中提前生成脚本源代码的编译数据的过程进行说明。

本实施例的数据处理方法包括前述的步骤S102~步骤S106,此外,在步骤S102之前还包括步骤S100。

步骤S100:对所述脚本的所有源代码进行编译操作,获得第三编译数据。

在本实施例中,为了提升后续脚本处理时的速度,减少用户的等待时间,预先对脚本的所有源代码进行解析操作和编译操作,获得的第三编译数据,使得后续步骤S102中,可以预先加载所述第三编译数据中的部分或全部数据至所述缓存中,作为所述第一编译数据。这样在执行脚本时,可以直接将序列化后的编译数据发送给脚本引擎,以减少脚本引擎的耗时,更好地节省时间,充分提升了数据处理速度。

由于是在非首次执行脚本之前,对全部源代码进行了编译操作和序列化操作,因此,相较于现有技术中仅用首次执行过程中编译出的极少量的源代码的编译数据进行非首次执行,在非首次执行时仍需要对大量源代码进行编译操作,本实施例可以实现在非首次执行时完全跳过解析操作和编译操作的效果。以网页显示为例,根据统计网页整个显示过程的耗时,发现脚本引擎的解析操作和编译操作所花费的时间占到了整个运行周期总时间的三分之一,其中解析操作占21.3%,编译操作占14.9%,也就是说,现有技术中在显示网页的过程中,解析操作和编译操作对显示速度的影响很大,而本实施例中可以在非首次执行时完全省略解析操作和编译操作,因而速度提升明显。

在一种可行方式中,步骤S100实现为:若确定所述脚本引擎处于空闲状态,则通过所述脚本引擎对所述脚本的所有源代码进行编译操作,获得所述第三编译数据。

在使用脚本引擎对所有源代码进行预先编译操作时,先确定脚本引擎是否处于空闲状态,若处于空闲状态再进行编译操作,保证了不会影响其他进程使用脚本引擎。

以浏览器显示页面的过程为例,如图2b所示,预先生成第三编译数据的过程包括:浏览器内核(具体为其中的render进程)确定脚本引擎处于空闲状态,将脚本的源代码(记作源代码A,该源代码A可以是全部源代码,也可以是首次显示网页时未进行编译操作的源代码)发送给脚本引擎,并指示其进行编译操作。脚本引擎针对获取的源代码A执行解析操作和编译操作,并获得对应的编译数据,对编译数据进行序列化操作,获得序列化后的编译数据(记作编译数据A,也可以称为字节码),并将序列化后的编译数据A 返回给浏览器内核的render进程。

如果源代码A是脚本中的所有源代码,则将序列化后的编译数据A、编译数据A与源代码A的对应关系作为第三编译数据存储到磁盘中,如图2b 中所示。

而如果源代码A仅是首次显示网页时未进行编译操作的源代码,则将序列化后的编译数据A、编译数据A与源代码A的对应关系、之前已编译源代码(记作源代码B)的序列化后的编译数据(记作编译数据B)、源代码B 及编译数据B的对应关系作为第三编译数据存储到磁盘中。

可选地,在本实施例中,编译数据与源代码的对应关系可以表示为键值形式(key-value)。如以源代码A为key,以序列化后的编译数据A为value。其中,key可以是采用哈希算法计算的源代码A的哈希值,或者其他值,本实施例对此不作限制。

在另一种可行方式中,步骤S100实现为:对所述脚本的所有源代码进行编译操作和序列化操作,获得包括序列化后的编译数据和所述编译数据与源代码对应关系的第三编译数据。

在本实施例中,对脚本的所有源代码进行编译操作,使得第三编译数据中包含所有源代码的编译数据,因而在后续步骤S102~步骤S106中脚本引擎可以完全省略解析操作和编译操作,故而可以有效降低等待时间。

此外,对所有源代码的编译数据进行序列化操作可以将编译数据转化为能够在磁盘中存储的字节码,使得可以将编译数据存储到磁盘中,实现持久化。

第三编译数据中包含序列化后的编译数据和编译数据与源代码对应关系,其中,序列化后的编译数据便于后续加载和使用,所述编译数据与源代码对应关系便于后续过程中可以快速匹配到与待执行源代码对应的序列化后的编译数据。

具体地对所有源代码进行编译操作和序列化操作的过程可以如前面对图 2b中编译操作和序列化操作的过程,故在此不再赘述。

通过本实施例,由于在执行脚本之前加载第一编译数据,因而不会占用执行脚本的时间,使得用户感知执行脚本的时间减少,这样就缩短了执行脚本的时间,实现了使执行脚本速度加快的效果。此外,在执行脚本时发送至脚本引擎的是编译数据,使得脚本引擎可以省略解析操作和编译操作,运行脚本的速度加快,从而执行脚本的时间减少,用户等待时间减少。

此外,针对所有源代码生成编译数据,使得在真正执行脚本时,无需进行编译操作,可以直接使用编译数据,提升了执行效率。并且,生成所有源代码的编译数据的过程利用脚本引擎的空闲时间,而非脚本真正执行时间,使得生成编译数据的成本极低,对用户影响较少。

本实施例的数据处理方法可以由任意适当的具有数据处理能力的电子设备执行,包括但不限于:服务器、移动终端(如平板电脑、手机等)和PC 机等。

实施例三

参照图3a,示出了根据本发明实施例三的一种数据处理方法的步骤流程图。在本实施例中,主要对预先加载至缓存中的第一编译数据是部分的第三编译数据时的数据处理过程进行说明。

本实施例的数据处理方法包括前述的步骤S102~步骤S106,其中,在将部分第三编译数据作为所述第一编译数据时,步骤S104包括以下步骤:

子步骤S1041:响应于脚本的执行指令,确定所述脚本中与所述执行指令相匹配的待执行源代码。

待执行源代码可以是脚本中所有源代码,也可以是业务逻辑相关的部分源代码。待执行源代码可以根据执行指令确定,或者采用其他任何适当的方式确定,本实施例对此不作限定。

例如,在显示网页时,如果网页中的某些控件未被触发,则待执行源代码中不包含未被触发的控件对应的业务逻辑,也就是说待执行源代码是脚本中的部分源代码。

子步骤S1042:根据所述对应关系,确定所述待执行源代码中的部分源代码与所述第一编译数据匹配,则从所述第一编译数据中获取与所述待执行源代码匹配的第一部分数据,和/或,并从预先存储有所述第三编译数据的磁盘中获取除所述第一部分数据之外的、与所述待执行源代码匹配的第二部分数据。

如前所述,由于第一编译数据是第三编译数据中的部分或全部,因此第一编译数据也包括编译数据和编译数据与源代码的对应关系。例如,对比关系A用于指示编译数据A与源代码A的对应关系。

这样在确定待执行源代码后,将待执行源代码与对应关系进行匹配。例如,使用哈希算法计算待执行源代码,获得与待执行源代码对应的至少一个 key。如,将待执行源代码分为多个代码段,针对每个代码段计算出一个key,多个key组合形成待执行源代码的key。

将待执行源代码的key与对应关系中的各个key进行比对。例如,将待执行源代码中各个代码段的key与对应关系中的各个key进行比对。比对结果可以分为三种,第一种为全部不匹配,第二种为全部匹配,第三种为部分匹配。

针对第一种,若全部不匹配,表示第一编译数据中没有与待执行源代码对应的编译数据,也就是从所述第一编译数据中获取的、与所述待执行源代码匹配的第一部分数据为空,此种情况中,浏览器内核中的render进程通过 IPC方式通过browser进程加载与待执行源代码对应的、需要的编译数据, browser进程读取保存在磁盘的字节码形式的编码数据给render进程。也就是从磁盘中获取的与所述待执行源代码匹配的第二部分数据即为全部所需的数据。

针对第二种,若全部匹配,表示第一编译数据中有与全部待执行源代码对应的编译数据,也就是从所述第一编译数据中获取的、与所述待执行源代码匹配的第一部分数据即为全部所需的编译数据,无需再从磁盘中获取编译数据,即第二部分数据为空。

针对第三种,若部分匹配,则从所述第一编译数据中获取与所述待执行源代码匹配的第一部分数据,并从预先存储有所述第三编译数据的磁盘中获取除所述第一部分数据之外的、与所述待执行源代码匹配的第二部分数据。

子步骤S1043:根据所述第一部分数据和/或所述第二部分数据,生成所述第二编译数据。

若第一部分数据为全部所需数据,则将第一部分数据作为第二编译数据,在后续步骤中,将其发送给脚本引擎,由脚本引擎对第二编译数据进行反序列化操作和运行操作,生成运行结果,以根据运行结果进行显示(如将运行结果返回给浏览器内核,使浏览器内核根据运行结果进行显示)。

若第二部分数据为全部所需数据,则将第二部分数据作为第二编译数据,在后续步骤中,将其发送给脚本引擎,由脚本引擎对第二编译数据进行反序列化操作和运行操作,生成运行结果,以根据运行结果进行显示(如将运行结果返回给浏览器内核,使浏览器内核根据运行结果进行显示)。

若第一部分数据和第二部分数据结合才是全部所需数据,则将两者结合作为第二编译数据。在后续步骤中,将其发送给脚本引擎,由脚本引擎对第二编译数据进行反序列化操作和运行操作,生成运行结果,以根据运行结果进行显示。

通过本实施例,由于在执行脚本之前加载第一编译数据,因而不会占用执行脚本的时间,使得用户感知执行脚本的时间减少,这样就缩短了执行脚本的时间,实现了使脚本处理速度加快的效果。此外,在执行脚本时发送至脚本引擎的是编译数据,使得脚本引擎可以省略解析操作和编译操作,运行脚本的速度加快,从而执行脚本的时间减少,用户等待时间减少。

在本实施例中,第一编译数据仅为所有源代码的编译数据中的部分时,可以针对不同的匹配情况,根据获得的第一部分数据和/或第二部分数据生成第二编译数据,提升了适应性。

本实施例的数据处理方法可以由任意适当的具有数据处理能力的电子设备执行,包括但不限于:服务器、移动终端(如平板电脑、手机等)和PC 机等。

使用场景:

下面通过对浏览器显示网页的过程进行说明的方式对前述的数据处理过程进行说明。

在网页进行首次显示时,可以采用现有技术中的显示过程,故本使用场景中对首次显示的过程不作过多描述。

由于首次显示时已经获取到了网页数据,因此,可以直接对网页数据中的脚本进行编译操作获得第三编译数据,如图3b和图3c中前半部所示,在获得网页显示指令时,根据第三编译数据进行网页显示,如图3b和图3c中后半部所示。

(一),参照图3b和图3c中前半部所示,生成第三编译数据过程包括:

步骤A1:render进程在确定V8引擎处于空闲状态时,传入脚本的所有源代码到V8引擎,由V8引擎执行解析操作和编译操作,以编译所有源代码,生成编译后的脚本对象即编译数据。之后,V8引擎根据编译数据进行序列化操作,生成序列化后的编译数据,并发送至render进程。

对于步骤A1需要说明的是,对源代码进行解析操作、编译操作和序列化操作均由V8引擎内部实现,本使用场景使用不同的JavaScript引擎可以由不同的实现方式,对此不作限制。

步骤B1:render进程使用步骤A1生成的序列化后的编译数据、编译数据与源代码的对应关系,生成第三编译数据。

对于步骤B1,生成的针对所有源代码的序列化后的编译数据可以理解为所有源代码中所有函数对应的序列化后的编译数据,即Full Code Cache。

步骤C1:render进程通过browser进程将第三编译数据保存到磁盘中,供下次显示网页使用。

通过预先生成所有源代码的编译数据的方式,解决了现有技术中,V8引擎在一个脚本的首次运行过程中,同时生成编译数据(即code Cache),并且保存到磁盘,并且后续不会更新,存在的由于首次运行使用到的源代码有限,首次运行时仅编译了极少量的源代码,所以保存起来的编译数据只占整个脚本的一小部分,导致后续再次运行脚本时,仍然需要在render进程执行脚本的过程中对大量源代码进行编译操作,导致耗费时间长的问题。

(二),参照图3b和图3c中后半部所示,基于第三编译数据进行网页的非首次显示过程包括:

步骤A2:浏览器内核对网页数据进行处理,在处理过程中浏览器内核中的browser进程创建render进程。render进程创建后立即加载第一编译数据,即通过IPC方式,利用browser进程从磁盘读取第一编译数据到缓存(即内存)中,并放置到Memory Code Cache模块中。

IPC方式用于不同模块之间进行通信,不同的模块可能在不同线程或进程中。

在本步骤中,将第一编译数据(即code cache)加载的时机提前到了执行脚本之前的空闲时间,这样render进程执行脚本的耗时不再受IPC方式依赖UI线程的限制,也不再受磁盘I/O的性能影响,而且能够减少执行脚本过程中加载第一编译数据的耗时。

而现有技术中,在render进程执行脚本时,才会发起同步IPC消息到Browser侧,Browser侧收到消息后,读取磁盘。这个过程由于同步IPC消息即意味着调用方需要同步等待被调用方返回调用结果,而根据目前实现,由于IPC的实现依赖UI线程的消息队列,导致在部分情况下(特别是在UI线程繁忙时),同步IPC的整体调用耗时较长。此外,在读取磁盘时,缺页中断和系统负载等因素都会很大程度影响磁盘I/O的性能,导致耗时较长。

步骤B2:浏览器内核进行页面加载,render进程执行脚本,确定执行指令对应的待执行源代码,并在第一编译数据中进行匹配。

render进程在执行脚本时,确定执行指令对应的待执行源代码,并在第一编译数据中进行匹配。如果在Memory Code Cache中缓存的第一编译数据中能够准确匹配对应的全部需要的编译数据(即获得第二编译数据),则执行步骤C2;如果不能匹配到全部需要的编译数据,则在匹配不到全部需要的编译数据时,若从第一编译数据中匹配到了第一部分数据,则从磁盘中读取第二部分数据,并根据第一部分数据和第二部分数据生成第二编译数据,再执行步骤C2;若从第一编译数据中完全没有匹配到数据,则从磁盘中读取全部需要的编译数据作为第二编译数据,再执行步骤C2。

步骤C2:发送第二编译数据,由V8引擎对第二编译数据进行反序列化操作,并运行反序列化操作的结果,将运行结果返回给render进程,进行显示。

这样可以完全避免在V8引擎中进行解析操作和编译操作,提升运行效率,减少运行耗时。

至此,实现了使用第二编译数据进行显示,以显示网页的过程,且在此过程中,脚本引擎无需进行解析操作和编译操作,使得脚本引擎运行脚本的速度更快,从而使网页显示速度更快,用户等待时间更少。

图3d示出了现有技术中首次显示网页时对脚本源代码的处理过程,从图 3d中可见,现有技术是在首次显示网页时,由脚本引擎(图中V8引擎)对部分源代码进行解析操作和编译操作获得编译数据,并在对编译数据运行过程中,对其他源代码进行编译操作,直至获得需要的运行结果,并将运行结果返回给render进程。render进程指示脚本引擎对编译数据进程序列化操作,获得序列化后的编译数据,并发送给render进程,render进程通过browser进程将序列化后的编译数据存储在磁盘中。上述过程因源代码在V8 引擎中进行解析操作和编译操作,导致显示耗时长,而本发明实施例提供的方案则有效克服了现有技术只有部分源代码有编译数据的问题。

图3e则示出了现有技术中在非首次显示网页时对脚本源代码的处理过程,从图3e中可见,现有技术中,在非首次显示网页时,render进程在执行脚本期间,通过browser进程加载序列化后的编译数据,导致加载速度受到了磁盘I/O的影响,使得执行脚本的总时间受到磁盘I/O的影响,而且, render进程将序列化后的编译数据和源代码发送给脚本引擎后,脚本引擎除了对序列化后的编译数据进行反序列化操作外,还需要对源代码进行编译操作,才能运行编译数据,获得编译结果,导致执行脚本的总耗时较长。

将上述3d和3e所示过程与本发明实施例方案中对应的3c和3b进行对比可见,因对脚本源代码编译时机和编译内容的不同,上述现有技术方案中存在的问题均得到了有效解决。

通过上述过程,在render进程真正执行脚本之前,对所有源代码进行编译操作,并生成第三编译数据,由于是在真正执行脚本之前,因此用户不会感知到这部分耗时,此外生成了与所有源代码对应的第三编译数据,因而在后续的真正执行脚本时,并不会出现有函数未生成编译数据,需要进一步进行解析操作和编译操作的问题,减少了耗时。

此外,通过选取render进程的空闲时间把第一编译数据提前加载到缓存中,当需要真正执行脚本时,则在缓存中查找可用的编译数据,并发送给V8 引擎,从而避免了现有技术中读取第一编译数据的IPC耗时和磁盘I/O耗时、以及脚本在V8引擎中的解析操作和编译操作耗时。

实施例四

参照图4,示出了根据本发明实施例四的一种数据处理方法的步骤流程示意图。

在本实施例中,以终端设备(例如个人电脑)作为执行主体,对数据处理方法的过程进行说明。

本实施例中,数据处理方法包括以下步骤:

步骤S402:根据接收到的携带有脚本的显示请求,调用脚本处理组件对所述脚本进行处理。

在一具体实现中,显示请求可以是配置与终端设备上的操作系统接收的非首次的显示请求。该显示请求中携带有脚本,例如,JavaScript脚本等。

操作系统可以是现有的应用于移动终端的操作系统(包括但不限于安卓和IOS),也可以是应用于个人电脑等的操作系统(包括但不限于Windows、 Linux、macOS等)。操作系统中配置有用于对脚本进行处理的脚本处理组件。需要说明的是,虽然本实施例中称为脚本处理组件,但任何能够实现脚本处理功能的模块、控件、函数等均可以视为脚本处理组件的等同。

操作系统根据显示请求调用脚本处理组件,使其对显示请求中携带的脚本进行处理。

所述脚本处理组件在执行脚本前,预先加载根据脚本的源代码生成的第一编译数据至缓存中,在接收到脚本的执行指令时,确定所述脚本中与所述执行指令相匹配的待执行源代码,并从所述第一编译数据中获取与所述待执行源代码对应的第二编译数据;使用脚本引擎运行所述第二编译数据,并获得运行结果。这样使得脚本处理组件在处理脚本时可以省略解析操作和编译操作,从而提升处理速度,减少等待时间。

在一种可行方式中,第一编译数据可以是预先存储的第三编译数据中的部分或全部。第三编译数据为脚本引擎预先对脚本中的所有源代码进行解析操作和编译操作之后获得的编译数据。脚本处理组件预先加载部分或全部第三编译数据作为第一编译数据到缓存中。

之后,脚本处理组件在接收到脚本的执行指令时,确定对应的待执行源代码,并根据缓存中的编译数据与源代码的对应关系和第一编译数据,确定与待执行源代码对应的第二编译数据,之后使用脚本引擎运行所述第二编译数据,并获得运行结果。

其中,使用脚本引擎运行所述第二编译数据,并获得运行结果可以实现为:将所述第二编译数据发送至所述脚本引擎,并指示所述脚本引擎对所述第二编译数据进行反序列化操作,并运行反序列化操作的操作结果,以获得运行结果。

这样使得脚本引擎可以直接获得第二编译数据,相较于现有技术中的获得源代码,对源代码进行解析操作和编译操作获得对应的编译数据之后再运行,本实施例的过程中可以省略最为耗时的解析操作和编译操作,直接对第二编译数据进行反序列化操作和运行即可,实现了节省时间的效果。

当然,在其他可行方式中,脚本处理组件处理脚本的实现过程可以采用前述实施例一到三中任一数据处理方法的实现过程,故在此不再赘述。

步骤S404:根据所述脚本处理组件的运行结果进行显示。

本领域技术人员可以根据需要采用任何适当的方式根据运行结果进行显示。例如,在一具体实现中,可以根据运行结果进行渲染,从而实现对数据的显示。通过本实施例,操作系统在获得显示请求,且显示请求中携带有脚本时,可以调用脚本处理组件对脚本进行处理以获得运行结果,从而根据运行结果进行显示。为了提升获得运行结果的速度,脚本处理组件在执行脚本之前预先加载第一编译数据到缓存中,从而在获取到脚本的执行指令时,确定与待执行的源代码对应的第二编译数据,并使用脚本引擎对第二编译数据进行处理获得处理结果。由于脚本引擎是对第二编译数据进行处理,因而可以省略解析操作和编译操作,从而能够很好地节省时间,提升处理速度。

实施例五

参照图5,示出了根据本发明实施例四的一种数据处理装置的结构框图。

本实施例的数据处理装置包括:预加载模块502,用于在执行脚本前,预先加载根据脚本的源代码生成的第一编译数据至缓存中;获取模块504,用于响应于脚本的执行指令,确定所述脚本中与所述执行指令相匹配的待执行源代码,并从所述第一编译数据中获取与所述待执行源代码对应的第二编译数据;发送模块506,用于将所述第二编译数据发送至脚本引擎,以获取所述脚本引擎运行所述第二编译数据的运行结果。

可选地,所述装置还包括:预编译模块500,用于所述预加载模块502 在执行脚本前,预先加载根据脚本的源代码生成的第一编译数据至缓存中之前,对所述脚本的所有源代码进行编译操作,获得第三编译数据;所述预加载模块502用于预先加载所述第三编译数据中的部分或全部数据至所述缓存中,作为所述第一编译数据。

可选地,所述预编译模块500用于:若确定所述脚本引擎处于空闲状态,则通过所述脚本引擎对所述脚本的所有源代码进行编译操作,获得所述第三编译数据。

可选地,所述预编译模块500用于对所述脚本的所有源代码进行编译操作和序列化操作,获得包括序列化后的编译数据和所述编译数据与源代码对应关系的第三编译数据。

可选地,当所述预加载模块502将部分第三编译数据作为所述第一编译数据时,所述获取模块504包括:匹配模块5041,用于响应于脚本的执行指令,确定所述脚本中与所述执行指令相匹配的待执行源代码;全数据获取模块5042,用于根据所述对应关系,从所述第一编译数据中获取与所述待执行源代码匹配的第一部分数据,和/或,并从预先存储有所述第三编译数据的磁盘中获取除所述第一部分数据之外的、与所述待执行源代码匹配的第二部分数据;生成模块5043,用于根据所述第一部分数据和/或所述第二部分数据,生成所述第二编译数据。

可选地,所述发送模块506包括:指示模块5061,用于将所述第二编译数据发送至脚本引擎,并指示所述脚本引擎对所述第二编译数据进行反序列化操作;渲染模块5062,用于根据所述脚本引擎对反序列化操作后的第二编译数据的运行结果,进行显示。

本实施例的数据处理装置用于实现前述多个方法实施例中相应的数据处理方法,并具有相应的方法实施例的有益效果,在此不再赘述。此外,本实施例的数据处理装置中的各个模块的功能实现均可参照前述方法实施例中的相应部分的描述,在此亦不再赘述。

实施例六

参照图6,示出了根据本发明实施例六的一种数据处理装置的结构框图。

本实施例的数据处理装置包括:请求调用模块602,用于根据接收到的携带有脚本的显示请求,调用脚本处理组件对所述脚本进行处理,其中,所述脚本处理组件在执行脚本前,预先加载根据脚本的源代码生成的第一编译数据至缓存中,在接收到脚本的执行指令时,确定所述脚本中与所述执行指令相匹配的待执行源代码,并从所述第一编译数据中获取与所述待执行源代码对应的第二编译数据;使用脚本引擎运行所述第二编译数据,并获得运行结果;页面显示模块604,用于根据所述脚本处理组件的运行结果进行显示。

可选地,所述脚本处理组件使用脚本引擎运行所述第二编译数据,并获得运行结果时,将所述第二编译数据发送至所述脚本引擎,并指示所述脚本引擎对所述第二编译数据进行反序列化操作,并运行反序列化操作的操作结果,以获得运行结果。

本实施例的数据处理装置用于实现前述多个方法实施例中相应的数据处理方法,并具有相应的方法实施例的有益效果,在此不再赘述。此外,本实施例的数据处理装置中的各个模块的功能实现均可参照前述方法实施例中的相应部分的描述,在此亦不再赘述。

实施例七

参照图7,示出了根据本发明实施例七的一种电子设备的结构示意图,本发明具体实施例并不对电子设备的具体实现做限定。

如图7所示,该电子设备可以包括:处理器(processor)702、通信接口(Communications Interface)704、存储器(memory)706、以及通信总线708。

其中:

处理器702、通信接口704、以及存储器706通过通信总线708完成相互间的通信。

通信接口704,用于与其它电子设备如终端设备或服务器进行通信。

处理器702,用于执行程序710,具体可以执行上述数据处理方法实施例中的相关步骤。

具体地,程序710可以包括程序代码,该程序代码包括计算机操作指令。

处理器702可能是中央处理器CPU,或者是特定集成电路ASIC (ApplicationSpecific Integrated Circuit),或者是被配置成实施本发明实施例的一个或多个集成电路。电子设备包括的一个或多个处理器,可以是同一类型的处理器,如一个或多个CPU;也可以是不同类型的处理器,如一个或多个CPU以及一个或多个ASIC。

存储器706,用于存放程序710。存储器706可能包含高速RAM存储器,也可能还包括非易失性存储器(non-volatile memory),例如至少一个磁盘存储器。

程序710具体可以用于使得处理器702执行以下操作:在执行脚本前,预先加载根据脚本的源代码生成的第一编译数据至缓存中;响应于脚本的执行指令,确定所述脚本中与所述执行指令相匹配的待执行源代码,并从所述第一编译数据中获取与所述待执行源代码对应的第二编译数据;将所述第二编译数据发送至脚本引擎,以获取所述脚本引擎运行所述第二编译数据的运行结果。

在一种可选的实施方式中,程序710还用于使得处理器702在所述在执行脚本前,预先加载根据脚本的源代码生成的第一编译数据至缓存中之前,对所述脚本的所有源代码进行编译操作,获得第三编译数据;程序710还用于使得处理器702在所述预先加载根据脚本的源代码生成的第一编译数据至缓存中时,预先加载所述第三编译数据中的部分或全部数据至所述缓存中,作为所述第一编译数据。

在一种可选的实施方式中,程序710还用于使得处理器702在所述对所述脚本的所有源代码进行编译操作,获得第三编译数据时,若确定所述脚本引擎处于空闲状态,则通过所述脚本引擎对所述脚本的所有源代码进行编译操作,获得所述第三编译数据。

在一种可选的实施方式中,程序710还用于使得处理器702在对所述脚本的所有源代码进行编译操作,获得所述第三编译数据时,对所述脚本的所有源代码进行编译操作和序列化操作,获得包括序列化后的编译数据和所述编译数据与源代码对应关系的第三编译数据。

在一种可选的实施方式中,当将部分第三编译数据作为所述第一编译数据时,程序710还用于使得处理器702在所述响应于脚本的执行指令,确定所述脚本中与所述执行指令相匹配的待执行源代码,并从所述第一编译数据中获取与所述待执行源代码对应的第二编译数据时,响应于脚本的执行指令,确定所述脚本中与所述执行指令相匹配的待执行源代码;根据所述对应关系,从所述第一编译数据中获取与所述待执行源代码匹配的第一部分数据,和/ 或,并从预先存储有所述第三编译数据的磁盘中获取除所述第一部分数据之外的、与所述待执行源代码匹配的第二部分数据;根据所述第一部分数据和/ 或所述第二部分数据,生成所述第二编译数据。

在一种可选的实施方式中,程序710还用于使得处理器702在所述将所述第二编译数据发送至脚本引擎,并根据所述脚本引擎运行所述第二编译数据的运行结果进行显示时,将所述第二编译数据发送至脚本引擎,并指示所述脚本引擎对所述第二编译数据进行反序列化操作;根据所述脚本引擎对反序列化操作后的第二编译数据的运行结果,以根据运行结果进行显示。

或者,

程序710具体可以用于使得处理器702执行以下操作:根据接收到的携带有脚本的显示请求,调用脚本处理组件对所述脚本进行处理,其中,所述脚本处理组件在执行脚本前,预先加载根据脚本的源代码生成的第一编译数据至缓存中,在接收到脚本的执行指令时,确定所述脚本中与所述执行指令相匹配的待执行源代码,并从所述第一编译数据中获取与所述待执行源代码对应的第二编译数据;使用脚本引擎运行所述第二编译数据,并获得运行结果;根据所述脚本处理组件的运行结果进行显示。

在一种可选的实施方式中,所述脚本处理组件使用脚本引擎运行所述第二编译数据,并获得运行结果,包括:将所述第二编译数据发送至所述脚本引擎,并指示所述脚本引擎对所述第二编译数据进行反序列化操作,并运行反序列化操作的操作结果,以获得运行结果。

程序710中各步骤的具体实现可以参见上述数据处理方法实施例中的相应步骤和单元中对应的描述,在此不赘述。所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的设备和模块的具体工作过程,可以参考前述方法实施例中的对应过程描述,在此不再赘述。

通过本实施例的电子设备,由于在执行脚本之前加载第一编译数据,因而不会占用执行脚本的时间,使得用户感知执行脚本的时间减少,这样就缩短了执行脚本的时间,实现了使网页显示速度加快的效果。此外,在执行脚本时发送至脚本引擎的是编译数据,使得脚本引擎可以省略解析操作和编译操作,运行脚本的速度加快,内核获取运行结果的速度加快,从而执行脚本的时间减少,用户等待时间减少。

需要指出,根据实施的需要,可将本发明实施例中描述的各个部件/步骤拆分为更多部件/步骤,也可将两个或多个部件/步骤或者部件/步骤的部分操作组合成新的部件/步骤,以实现本发明实施例的目的。

上述根据本发明实施例的方法可在硬件、固件中实现,或者被实现为可存储在记录介质(诸如CD ROM、RAM、软盘、硬盘或磁光盘)中的软件或计算机代码,或者被实现通过网络下载的原始存储在远程记录介质或非暂时机器可读介质中并将被存储在本地记录介质中的计算机代码,从而在此描述的方法可被存储在使用通用计算机、专用处理器或者可编程或专用硬件(诸如 ASIC或FPGA)的记录介质上的这样的软件处理。可以理解,计算机、处理器、微处理器控制器或可编程硬件包括可存储或接收软件或计算机代码的存储组件(例如,RAM、ROM、闪存等),当所述软件或计算机代码被计算机、处理器或硬件访问且执行时,实现在此描述的数据处理方法。此外,当通用计算机访问用于实现在此示出的数据处理方法的代码时,代码的执行将通用计算机转换为用于执行在此示出的数据处理方法的专用计算机。

本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及方法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明实施例的范围。

以上实施方式仅用于说明本发明实施例,而并非对本发明实施例的限制,有关技术领域的普通技术人员,在不脱离本发明实施例的精神和范围的情况下,还可以做出各种变化和变型,因此所有等同的技术方案也属于本发明实施例的范畴,本发明实施例的专利保护范围应由权利要求限定。

相关技术
  • 数据处理方法及装置、电子设备和计算机可读存储介质
  • 数据处理方法和装置、计算机可读存储介质和电子设备
技术分类

06120113084544