一种加速应用程序启动的方法和装置
技术领域
本发明属于互联网领域,尤其涉及一种加速应用程序启动的方法和装置。
背景技术
在应用程序启动时,根据启动的时机可以划分为冷启动(cold startup)和热启动(warm startup)两种,在托管应用程序环境中,冷启动是指NET Framework系统程序集和应用程序代码均不在内存中时,因而需要从磁盘提取它们;热启动则是指应用程序的后续启动,或者当大部分系统代码因之前由另一托管应用程序使用而已经存在于内存中时的应用程序启动。
由于应用程序的启动速度直接影响了用户对应用程序的首次体验印象,因此对于提高应用程序的启动速度显得尤为重要。在应用程序启动,尤其是应用程序冷启动时,应用程序需要从硬盘通过硬盘I/O读入相应的页面,由于读取的页面会存放在不同文件或者目录中,可能从第一个文 件的某部分读取一些页面,又从第一个文件的相距较远的另一部分中读入一些页面,接着从另一不同的文件中读入一些页面,然后从一个目录中读入页面后,再从第一个文件中读入一些页面,这样会导致增加磁盘寻道时间,影响磁盘I/O的效率,从而导致应用程序的启动速度过慢。
发明内容
本发明实施例的目的在于提供一种加速应用程序启动的方法,以解决现有技术中应用程序启动时,由于磁盘I/O效率低下而影响应用程序启动过慢的问题。
本发明实施例是这样实现的,一种加速应用程序启动的方法,所述方法包括:
接收并解析所述应用程序的可移植的执行体文件和应用程序的符号文件,根据所述符号文件在所述应用程序中插入可用于记录应用程序的数据代码运行信息的标识;
运行所述插入了标识信息的应用程序,获取所述标识记录的数据代码运行信息;
根据所述记录的数据代码的运行信息,改变所述数据代码在可移植的执行体文件中的存储的位置信息。
本发明实施例的另一目的在于提供一种加速应用程序启动的装置,所述装置包括:
解析插入单元,用于接收并解析所述应用程序的可移植的执行体文件和应用程序的符号文件,根据所述符号文件在所述应用程序中插入可用于记录应用程序的数据代码运行信息的标识;
运行获取单元,用于运行所述插入了标识信息的应用程序,获取所述标识记录的数据代码运行信息;
位置信息改变单元,用于根据所述记录的数据代码的运行信息,改变所述数据代码在可移植的执行体文件中的存储的位置信息。
在本发明实施例中,根据接收和解析的应用程序的符号文件,在解析的可移植的执行体文件中加入可用于记录应用程序的数据代码运行信息的标识,在应用程序运行时,得到数据代码运行信息,并且根据所述运行信息调整数据代码在可移植的执行体文件中的存储位置,使得应用程序运行时可以有效的减少硬盘I/O跳转的次数,提高读取硬盘数据的效率,从而达到提高应用程序的启动速度的目的。
附图说明
图1是本发明第一实施例提供的加速应用程序启动的方法的实现流程图;
图2是本发明第二实施例提供的加速应用程序启动的方法的实现流程图;
图3是本发明第三实施例提供的加速应用程序启动的方法的实现流程图;
图4为本发明第四实施例提供的加速应用程序启动的装置的结构示意图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
本发明实施例可应用于Windows操作系统环境下的应用程序的启动速度的优化,基于同样的原理,也可以应用于其它操作系统。以Windows操作系统为例,本发明技术方案在应用程序的可移植的执行体文件编译出来后,完全不依赖于Visual C++compiler(VC++编译器)与Visual Studio linker(VS链接器)的帮助,通过对对可移植的执行体(英文简称为PE,英文全称为Portable Execute) 文件进行数据代码的重新布局存储位置,使得其在启动阶段速度加快,尤其是在冷启动阶段,对I/O时间占用比较大的程序效果特别显著。
实现本发明的应用程序的启动主要包括以下步骤:
接收并解析所述应用程序的可移植的执行体文件和应用程序的符号文件,根据所述符号文件在所述应用程序中插入可用于记录应用程序的数据代码运行信息的标识;运行所述插入了标识信息的应用程序,获取所述标识记录的数据代码运行信息;根据所述记录的数据代码的运行信息,改变所述数据代码在可移植的执行体文件中的存储的位置信息。根据接收和解析的应用程序的符号文件,在解析的可移植的执行体文件中加入可用于记录应用程序的数据代码运行信息的标识,在应用程序运行时,得到数据代码运行信息,并且根据所述运行信息调整数据代码的存储位置,使得应用程序运行时可以有效的减少磁盘I/O跳转的次数,提高读取数据的效率,从而达到提高应用程序的启动速度的目的。
经过项目验证,对于冷启动时间为4.1秒的应用程序,经本发明所述技术方案的方法优化后,启动时间达到1.9秒,程序冷启动时的硬页故障(hard page fault)由8000左右降到3000左右,极大的减少了I/O的读取,提高启动效率。
实施例一:
图1示出了本发明第一实施例提供的加速应用程序启动的方法的实现流程,详述如下:
在步骤S101中,接收并解析所述应用程序的可移植的执行体文件和应用程序的符号文件,根据所述符号文件在所述应用程序中插入可用于记录应用程序的数据代码运行信息的标识。
具体的,所述可移植的执行体是Portable Execute的中文全称,其英文简称为PE,常见的以EXE、DLL、OCX、SYS、COM后缀的文件都是PE文件, PE文件是微软Windows操作系统上的程序文件,其中可能是间接被执行,如 DLL文件。
所述符号文件(Symbol Files)是一个数据信息文件,它包含了应用程序二进制文件(比如以EXE、DLL等为后缀的文件)的调试信息,专门用于调试,最终生成的可执行文件在运行时并不需要符号文件,但程序中所有的变量信息都记录在这个文件中。用Visual C++和WinDbg调试程序时都要用到这个文件。
在Windows系统中,符号文件以.pdb为扩展名,比如:每个Windows操作系统下有一个GDI32.dll文件,编译器在编译该DLL文件的时候会产生一个 GDI32.pdb文件,一旦你拥有了这个PDB文件,那么便可以用它来调试并跟踪到GDI32.dll内部。
一般情况下,符号文件包括以下的数据信息:
全局变量(Global variables);
局部变量(Local variables);
函数名和它们的入口地址(Function names and the addresses of theirentry points);
FPO数据(Frame Pointer Omission):Frame Pointer是一种用来在调用堆栈(Call stack)中找到下一个将要被调用的函数的数据结构源代码的行序号(Source-linenumbers)
所述可用于记录应用程序的数据代码运行信息的标识,可以但不局限为每个访问函数插入hook(勾子)函数,通过使用Event Tracing for Windows记录下相关信息直到程序启动完毕,所述相关信息,比如可以为应用程序启动过程中对应用程序中的数据代码的访问的先后顺序、访问的时长等。
由于符号文件中记录了应用程序的函数的源代码的行号以及函数的入口地址,因此可以根据入口地址及行号信息,方便的插入hook函数。
在步骤S102中,运行所述插入了标识信息的应用程序,获取所述标识记录的数据代码运行信息。
在步骤S101中对应用程序插入了标识信息后,运行所述插入了标识信息的应用程序,通过能够记录标识信息的应用程序,如对于插入的hook函数,对每一个function,创建一个function_thunk函数,并用function_thunk取代原有的所有function的调用地址,通过Event Tracing for Windows记录应用程序的调用信息。当然,还可以通过其它与符号文件结合的方式,插入其它标识信息获取函数的调用信息。
所述数据代码的运行信息,可以包括所述数据代码的访问顺序。
在步骤S103中,根据所述记录的数据代码的运行信息,改变所述数据代码在可移植的执行体文件中的存储的位置信息。
其中,所述记录的数据代码的运行信息,可以通过解析符号文件中包括的排序信息块获取。
在得到数据代码的运行信息,比如运行调用的先后顺序等信息后,相应的改变数据代码在可移植的执行体文件中的存储位置,使其在使用较少次数的磁盘I/O,即可方便的调用其中的数据,从而提高磁盘I/O效率。
其中,在所述获取所述标识记录的数据代码运行信息包括所述数据代码的访问顺序时,可以根据所述数据代码的访问地址和数据代码的访问顺序,依次在硬盘中存储所述数据代码。
本发明实施例可以通过在应用程序的可移植的执行体文件中加入可用于记录应用程序的数据代码运行信息的标识,在应用程序运行时,得到数据代码运行信息,并且根据所述运行信息调整数据代码的存储位置,使得应用程序运行时可以有效的减少读取硬盘数据时的I/O跳转的次数,提高读取硬盘数据的效率,从而达到提高应用程序的启动速度的目的。
实施例二:
图2示出了本发明第二实施例提供的加速应用程序启动的方法流程图,详述如下:
在步骤S201中,编译所述应用程序的可移植的执行体文件,生成所述可移植的执行体文件对应的符号文件。
在Windows系统中,对于C++应用程序,可以通过Visual C++compiler 编译器进行编译,得到PDB文件。PDB文件的结构是由下面几个部分组成的:
数据库头部(Database Header);
记录入口列表(List of Record Entries);
应用信息块(AppInfo Block)(可选);
排序信息块(SortInfo Block)(可选);
数据库记录信息(Sequence of raw record data);
其中在数据库头部结构中,确定了应用信息块(AppInfo Block)和排序信息块(SortInfo Block)的位置信息。记录入口列表中确定了所有记录的位置相关的信息。
在步骤S202中,接收并解析所述应用程序的可移植的执行体文件和应用程序的符号文件,根据所述符号文件在所述应用程序中插入可用于记录应用程序的数据代码运行信息的标识。
在步骤S203中,运行所述插入了标识信息的应用程序,获取所述标识记录的数据代码运行信息。
在步骤S204中,根据所述记录的数据代码的运行信息,改变所述数据代码在可移植的执行体文件中的存储的位置信息。
另外,还可以包括步骤S205,编译所述改变了数据代码的存储的位置信息的应用程序,生成新的应用程序对应的符号文件。
通过步骤S205生成新的符号文件,可以转至步骤S202中,进一步对应用程序的启动效率进行优化。
本发明实施例与实施例一不同之处在于,根据符号文件中包括的排序信息对数据代码进行排序后,进一步生成新的符号文件,可便于再次对应用程序的数据文件进行重新布置存储位置,从而再次对其存储位置进行优化。
实施例三:
图3为本发明第三实施例提供的加速应用程序启动的方法的流程示意图,详述如下:
在步骤S301中,接收并解析所述应用程序的可移植的执行体文件和应用程序的符号文件,根据所述符号文件在所述应用程序中插入可用于记录应用程序的数据代码运行信息的标识;
在步骤S302中,运行所述插入了标识信息的应用程序,获取所述标识记录的数据代码运行信息;
在步骤S303中,根据所述记录的数据代码的运行信息,改变所述数据代码在可移植的执行体文件中的存储的位置信息。
在步骤S304中,在系统读取硬盘的应用程序的数据代码时,通过磁盘I/O 一次读取与需要的页面相邻的多个页面。
在实施例二 中通过将数据代码重新排序,使得磁盘I/O读取数据时能够减少跳转次数,提高访问效率,而本实施例通过一次读取多个相邻页面的数据代码,减少磁盘I/O的次数,可进一步提高数据访问效率。
实施例四:
图4为本发明第四实施例提供的加速应用程序启动的装置的结构示意图,详述如下:
本发明实施例所述加速应用程序启动的装置,包括:
解析插入单元401,用于接收并解析所述应用程序的可移植的执行体文件和应用程序的符号文件,根据所述符号文件在所述应用程序中插入可用于记录应用程序的数据代码运行信息的标识;
运行获取单元402,用于运行所述插入了标识信息的应用程序,获取所述标识记录的数据代码运行信息;
位置信息改变单元403,用于根据所述记录的数据代码的运行信息,改变所述数据代码在可移植的执行体文件中的存储的位置信息。
其中,本发明实施例还可包括第一编译单元404,用于编译所述应用程序的可移植的执行体文件,生成所述可移植的执行体文件对应的符号文件。
第二编译单元405,用于编译所述改变了数据代码的存储的位置信息的应用程序,生成新的应用程序对应的符号文件。
读取单元406,用于在系统读取硬盘的应用程序的数据代码时,通过磁盘 I/O一次读取与需要的页面相邻的多个页面。
其中,所述获取所述标识记录的数据代码运行信息包括所述数据代码的访问顺序。所述根据所述记录的数据代码的运行信息,改变所述数据代码在可移植的执行体文件中的存储的位置信息步骤为根据所述数据代码的访问地址和数据代码的访问顺序,依次在硬盘中存储所述数据代码。
本发明所述装置实施例与实施例一至三所述方法实施例相对应,在此不作重复赘述。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。