CN103019705B - 基于持久存储既有计算结果来加速程序计算的方法及系统 - Google Patents
基于持久存储既有计算结果来加速程序计算的方法及系统 Download PDFInfo
- Publication number
- CN103019705B CN103019705B CN201210496533.4A CN201210496533A CN103019705B CN 103019705 B CN103019705 B CN 103019705B CN 201210496533 A CN201210496533 A CN 201210496533A CN 103019705 B CN103019705 B CN 103019705B
- Authority
- CN
- China
- Prior art keywords
- function
- monitored
- parameter
- execution result
- program
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Landscapes
- Debugging And Monitoring (AREA)
Abstract
本发明公开了基于持久存储既有计算结果来加速程序计算的方法及系统,属于计算机领域。基于持久存储既有计算结果来加速程序计算的方法包括:设定所要监控的函数;监控受监控函数实例的执行;若受监控函数实例未运行过,则直接执行受监控函数代码,并将受监控函数执行实例的参数及执行结果存储在持久存储设备中;否则直接从持久存储设备中将受监控函数执行实例的执行结果取出来,作为本次受控函数执行实例的结果。基于持久存储既有计算结果来加速计算的系统包括:程序计算执行装置和程序计算结果的持久存储装置。本发明能够有效地加速程序运行效率,尤其是适合存在大量重复且费时函数的程序。
Description
技术领域
本发明属于计算机领域,主要关注提高程序计算的执行效率。
背景技术
目前提高程序计算的执行效率主要有两类手段,一类是提高计算机硬件CPU的处理能力;另外一类是提高程序本身的并发执行度。本发明则从单个程序单次运行中多次调用同一个函数及相同参数值、多个程序单次运行中多次调用同一个函数及相同参数值、程序的多次执行中多次调用同一个函数及相同参数值,因此有效减少重复计算次数将会有效地提高程序计算的执行效率。
发明内容
本发明目的是为了提高程序计算的执行效率,提供一种基于持久存储既有计算结果来加速程序计算的方法及系统。
基于持久存储既有计算结果来加速程序计算的方法包括:设定所要监控的函数;动态监控受监控函数的执行实例;若受监控函数实例未运行过,则直接执行受监控函数代码,并将受监控函数执行实例的执行结果存储在持久存储设备中;若受监控函数实例已运行过,则直接从持久存储设备中将受监控函数执行实例的执行结果取出来,作为本次受控函数执行实例的结果。
基于持久存储既有计算结果来加速程序计算的方法,包括具体步骤如下:
第1、设定所要监控的函数;
第2、获取受监控函数集合到内存;
第3、加载待运行程序到内存;
第4、扫描待运行程序并针对受监控函数增加监控钩子函数代码;
第5、执行程序,直到执行到调用受监控函数点和程序结束点中的任意一个条件;
第6、若运程程序运行到程序结束点,则执行步骤14;
第7、若运行程序执行到调用受监控函数点处,则调用监控钩子函数代码,即执行步骤8;
第8、监控钩子函数代码从持久存储设备读取并检索是否存在受监控函数及参数的历史执行结果,若存在受监控函数及参数的历史执行结果,则执行步骤9;否则执行步骤11;
第9、监控钩子函数代码获取受监控函数及参数的历史执行结果,并赋给当前受监控函数的调用者;
第10、跳过对受监控函数实例的执行,进一步执行步骤13;
第11、因为不存在受监控函数及参数的历史执行结果,因此直接执行受监控函数实例,获取执行结果,并赋给当前受监控函数的调用者;
第12、将当前受监控函数执行实例的参数及执行结果存储在持久存储设备中;
第13、继续执行程序,执行步骤5;
第14、程序执行结束。
其中,第1步骤所述的“设定所要监控的函数”,是在操作系统运行下,任意时间可以动态设定所要监控的函数,包括增加新的监控函数、删除已有的监控函数。所有受监控的函数统称为“受监控函数集合”。每一个受监控函数的基本信息包括函数唯一索引号、函数名、参数个数、{参数名、参数类型}序列表、函数执行结果的有效时间,其中函数的返回值属于函数参数。
第4步骤所述的“扫描待运行程序,针对受监控函数增加监控钩子函数代码”中,扫描待运行程序既可以是扫描待运行程序的源程序,也可以是扫描待运行程序的二进制程序代码,二进制程序代码也包括由Java、C#等源代码生成的中间代码。
扫描待运行程序的源程序并增加监控钩子函数代码的方法为:首先增加一个与受监控函数对应的监控钩子函数代码,监控钩子函数与受监控函数的函数声明相同,监控钩子函数的实现代码流程为本发明方法中的第7至13步骤;最后将待运行程序源代码中所有调用受监控函数的语句改为调用监控钩子函数语句,其中监控钩子函数中调用受监控函数的语句除外。
扫描待运行程序的二进制程序代码并增加监控钩子函数代码的方法有两种。第1种方法为:首先创建与受监控函数的函数声明相同的监控钩子函数,并动态加载到运行程序的内存空间中,监控钩子函数的实现代码流程为本发明方法中的第7至13步骤;最后将将运行程序中所有调用受监控函数的调用指令作修改,用监控钩子函数的函数地址替换受监控函数的函数地址,其中监控钩子函数中调用受监控函数的语句除外。第2种方法为:首先创建与受监控函数的函数声明相同的监控钩子函数,并动态加载到运行程序的内存空间中,监控钩子函数的实现代码流程为本发明方法中的第7至13步骤;运行程序执行过程中,扫描指令序列,当发现将要调用受监控函数的指令时,直接改为调用受监控函数的监控钩子函数,其中监控钩子函数中调用受监控函数的语句除外。
受监控函数的监控钩子代码首先在持久存储设备上检索受监控函数及参数的历史执行结果是否存在,若存在直接从持久存储设备上获取受监控函数及参数的历史执行结果,然后跳过对受监控函数的调用;否则需执行受监控函数,并将受监控函数的执行结果存储在持久存储设备上。最后受监控函数的监控钩子函数将执行权交给运行程序的下一指令代码。第8、9、12步骤中所涉及的持久存储设备指在掉电情况下已保存的数据不会丢失的存储设备,包括磁盘、磁带存储设备,也包括具有持久存储能力的数据库。
第12步骤中将当前受监控函数执行实例的参数及执行结果存储在持久存储设备中。受监控函数执行实例的参数及执行结果的存储基本信息包括函数唯一索引号、函数名、参数个数、(参数名,参数值)序列表、函数执行时间。为了快速检索,在函数唯一索引号、函数名、参数名关键字段建立索引。
本发明同时提供一种基于持久存储既有计算结果来加速程序计算的系统,所述系统包括程序计算装置和受监控函数计算结果的持久存储装置。
程序计算装置包括管理持久存储设备中受监控函数及参数的历史执行结果模块、检索受监控函数及参数的历史执行结果模块、设定所要监控的函数集合模块、获取受监控函数集合到内存模块、加载待运行程序到内存模块、扫描待运行程序,对受监控函数增加监控钩子模块、程序执行模块;
持久存储装置包括受监控函数及参数的历史执行结果管理模块、检索受监控函数及参数的历史执行结果模块、受监控函数信息管理模块、持久存储介质。检索受监控函数及参数的历史执行结果模块既可以在程序计算装置中完成,也可以在受监控函数计算结果的持久存储装置中完成,也可以在程序计算装置和受监控函数计算结果的持久存储装置中协作完成。
本发明所涉及的具体内容及所述术语的含义是:
(1)受监控的函数:指那些运行耗时较多且频繁运行的函数,在程序计算装置的操作系统上任何时间可以设定对这些函数运行的监控。所有受监控的函数统称为“受监控函数集合”。
(2)基于持久存储既有计算结果来加速程序计算的系统,包括程序计算装置和受监控函数计算结果的持久存储装置。程序计算装置和受监控函数计算结果的持久存储装置之间可采用数据电缆直连(包括USB接口)、有线网网络连接、无线网络连接多种连接方式。
程序计算装置功能主要是对受监控函数的设定、管理持久存储设备中受监控函数及参数的历史执行结果、检索受监控函数及参数的历史执行结果、获取受监控函数集合、加载待运行程序、扫描待运行程序并对受监控函数增加监控钩子、进行待运行程序的执行等功能。其中对受监控函数的设定功能包括增加、删除、修改受监控函数;管理持久存储设备中受监控函数及参数的历史执行结果的功能包括增加、删除持久存储设备中受监控函数及参数的历史执行结果。
程序计算装置既可以是通用的计算机,也可以是嵌入式系统。
受监控函数计算结果的持久存储装置功能主要是受监控函数信息管理、受监控函数及参数的历史执行结果管理、检索受监控函数及参数的历史执行结果功能。所有持久信息需要最终保存到受监控函数计算结果的持久存储装置的持久存储介质中。其中受监控函数信息管理的功能包括增加、删除、修改受监控函数;受监控函数及参数的历史执行结果管理的功能包括增加、删除持久存储设备中受监控函数及参数的历史执行结果。
受监控函数计算结果的持久存储装置既可以是磁盘、磁带,也可以是具有持久存储能力的数据库系统。
检索受监控函数及参数的历史执行结果模块既可以在程序计算装置中完成,也可以在受监控函数计算结果的持久存储装置中完成,也可以在程序计算装置和受监控函数计算结果的持久存储装置中协作完成。
(3)为了提高检索受监控函数及参数的历史执行结果的效率,在函数唯一索引号、函数名、参数名关键字段建立多个索引,包括哈希索引和B+树索引。同时,在程序计算装置的内存中可以提前预存放部分受监控函数及参数的历史执行结果,以提高频繁被调用的受监控函数及参数的历史执行结果的获取效率。
(4)扫描待运行程序的二进制程序代码并增加监控钩子函数代码的方法有两种:
第1种方法为:首先创建与受监控函数的函数声明相同的监控钩子函数,并动态加载到运行程序的内存空间中,监控钩子函数的实现代码流程为本发明方法中的第7至13步骤;最后将将运行程序中所有调用受监控函数的调用指令作修改,用监控钩子函数的函数地址替换受监控函数的函数地址,其中监控钩子函数中调用受监控函数的语句除外。第1种方法的优点具有通用性,仅对待运行程序本身代码做少量地址修改,且该方法可直接多个运行程序共享受监控函数的历史执行结果,因而加快多个运行程序执行的执行效率。
第2种方法为:首先创建与受监控函数的函数声明相同的监控钩子函数,并动态加载到运行程序的内存空间中,监控钩子函数的实现代码流程为本发明方法中的第7至13步骤;运行程序执行过程中,扫描指令序列,当发现将要调用受监控函数的指令时,直接改为调用受监控函数的监控钩子函数,其中监控钩子函数中调用受监控函数的语句除外。其中第2种方法利用了面向方面编程中的反转控制机制(即IoC)来实现。第2种方法的优点也具有通用性,且该方法可直接多个运行程序共享受监控函数的历史执行结果,因而加快多个运行程序执行的执行效率;同时第2种方法无需改变待运行程序本身代码。
(5)程序计算装置中扫描待运行程序既可以是扫描待运行程序的源程序,也可以是扫描待运行程序的二进制程序代码,二进制程序代码也包括由Java、C#等源代码编译生成的其对应虚拟机可执行的中间代码。
本发明的优点和积极效果:
本发明能够加速程序计算运行的效率。
对于单个程序而言,单个程序代码中存在相同函数及参数的多次调用,则只需执行该函数及参数一次,便可多次直接获取其运行结果,特别对那些需要耗费大量时间才能获得结果的函数,程序计算运行的效率提高将非常明显。另外,单个程序的多次执行,也将大大受益于前次的程序计算运行,从而减少函数的重复执行,提高运行效率。
对于多个程序而言,多个程序代码中往往存在相同函数及参数的多次调用,则通过被发明可将大大提高这些程序的运行效率。
附图说明
图1是本发明中程序运行流程图,当程序运行到调用受监控函数点时,将由调用受监控函数钩子函数取代。
图2是本发明中系统架构示意图,由图可知系统分为程序计算装置和持久存储装置。
图3是本发明中未引入监控钩子函数的程序代码示意图。
图4是本发明中引入监控钩子函数的程序代码示意图。
图5是本发明中受监控函数钩子函数的运行流程图。
图6是本发明中案例计算斐波那契数列Fibonacci的程序伪代码图。
图7是本发明中案例计算斐波那契数列f(5)的函数调用图。
图8是本发明中案例计算斐波那契数列Fibonacci程序中引入监控钩子函数后的程序伪代码图。
图9是本发明中案例斐波那契数列Fibonacci的程序代码图(图6)中f()函数的汇编代码。
图10是本发明中案例斐波那契数列Fibonacci的程序代码图(图6)中main()函数的汇编代码。
具体实施方式
实施例1、基于持久存储既有计算结果来加速程序计算的系统
如图2所示,本发明所提供的系统包括:
程序计算装置100、持久存储装置300,二者之间采用数据电缆直连(包括USB接口)、有线网网络连接、无线网络连接多种连接方式。
程序计算装置包括:管理持久存储设备中受监控函数及参数的历史执行结果模块110、检索持久存储设备中受监控函数及参数的历史执行结果模块120、设定所要监控的函数集合模块130、获取受监控函数集合到内存模块140、加载待运行程序到内存模块150、扫描待运行程序及对受监控函数增加监控钩子模块160和程序执行模块170;
持久存储装置包括:受监控函数及参数的历史执行结果管理模块310、检索受监控函数及参数的历史执行结果模块320、受监控函数信息管理模块330和持久存储介质390。
其中程序计算装置中的“设定所要监控的函数集合模块130”负责动态设定所要监控的函数集合,并把受监控函数集合通过持久存储装置中的“受监控函数信息管理模块330”存储在“持久存储介质390”中;程序计算装置启动时或动态运行“获取受监控函数集合到内存模块140”,“获取受监控函数集合到内存模块140”将通过通过持久存储装置中的“受监控函数信息管理模块330”从“持久存储介质390”读取受监控函数集合到程序计算装置的内存中;程序计算装置中的“加载待运行程序到内存模块150”加载用户指定的待运行程序,并进一步由程序计算装置中的“扫描待运行程序及对受监控函数增加监控钩子模块160”对待运行程序进行扫描和增加监控钩子;程序计算装置中的“程序执行模块170”监控运行已增加监控钩子的待运行程序,当执行到监控钩子时,由程序计算装置中的“检索持久存储设备中受监控函数及参数的历史执行结果模块120”负责向持久存储装置中的“检索受监控函数及参数的历史执行结果模块320”模块发起受监控函数实例历史执行结果的查询,若历史执行结果存在,则由程序计算装置中的“程序执行模块170”直接将历史执行结果返回给受监控函数,而不再需要再次执行受监控函数;若历史执行结果不存在,则由程序计算装置中的“程序执行模块170”执行受监控函数,受监控函数的执行结果由程序计算装置中的“管理持久存储设备中受监控函数及参数的历史执行结果模块110”通过持久存储装置中的“受监控函数及参数的历史执行结果管理模块310”将受监控函数最新执行结果存储到持久存储装置中的“持久存储介质390”;程序计算装置中的“程序执行模块170”继续监控执行待运行程序,重复上述过程,直到待运行程序运行结束,则本次程序监控执行结束。
实施例2、基于持久存储既有计算结果来加速程序计算的方法
如图1所示,本发明方法具体步骤如下:
第1、设定所要监控的函数;
第2、获取受监控函数集合到内存;
第3、加载待运行程序到内存;
第4、扫描待运行程序,针对受监控函数增加监控钩子函数代码;
第5、执行程序,直到执行到调用受监控函数点和程序结束点中的任意一个条件;
第6、若运程程序运行到程序结束点,则执行步骤14;
第7、若运行程序执行到调用受监控函数点处,则调用监控钩子函数代码,即执行步骤8;
第8、监控钩子函数代码从持久存储设备读取并检索是否存在受监控函数及参数的历史执行结果,若存在受监控函数及参数的历史执行结果,则执行步骤9;否则执行步骤11;
第9、监控钩子函数代码获取受监控函数及参数的历史执行结果,并赋给当前受监控函数的调用者;
第10、跳过对受监控函数实例的执行,进一步执行步骤13;
第11、因为不存在受监控函数及参数的历史执行结果,因此直接执行受监控函数实例,获取执行结果,并赋给当前受监控函数的调用者;
第12、将当前受监控函数执行实例的参数及执行结果存储在持久存储设备中;
第13、继续执行程序,执行步骤5;
第14、程序执行结束。
为能进一步了解本发明的技术内容、特点及功效,兹列举以下应用实例,并配合附图详细说明如下:
应用实例1
如图6所示,计算斐波那契数列Fibonacci的程序伪代码,函数f()为斐波那契数列Fibonacci计算函数。当主程序main调用f(5)后,将递归调用如下斐波那契数列函数f()序列:
f(5),f(4),f(3),f(2),f(1),f(0),f(1),f(2),f(1),f(0),f(3),f(2),f(1),f(0),f(1)
上述斐波那契数列函数f()序列中存在大量的重复调用,例如f(3)被重复调用计算2次,f(2)被重复调用计算3次。这无疑使得程序计算装置的不断重复计算多次,从而浪费了程序计算装置宝贵的计算能力。
目前已有的改进是针对斐波那契数列这个特定问题,改造函数f(),将函数f()的已经计算出的结果保存在程序计算装置的内存中。如果内存中已经有函数f()的计算结果,就无需调用函数f()代码重复计算。但是这种方案有2个不足:(1)该方案针对特定问题给出特定解决方法,不具有通用性;(2)当程序计算装置重新加电启动后以及再次运行该程序时,依然需要重新重复计算函数f()序列。
针对应用实例1应用本发明给出的系统:程序计算装置为一台计算机;持久存储装置为一数据库系统。程序计算装置和持久存储装置通过网络实现通信连接。
针对应用实例1应用本发明给出的方法,具体步骤如下(以下是应用实例1首次运行):
第1、在运行应用实例1程序前,设定所要监控的函数即斐波那契数列函数f(),具体设定所要监控的函数信息:函数唯一索引号、函数名f,参数个数2,{参数1名:n、参数1类型:unsignedint},{参数2名:返回值、参数1类型:longlong},函数执行结果的有效时间。所要监控的函数信息将由持久存储装置中的“受监控函数信息管理模块330”保存在持久存储介质中;
第2、在运行应用实例1程序前,程序计算装置中的“获取受监控函数集合到内存模块”从持久存储装置中获取受监控函数集合信息到程序计算装置中的内存;
第3、程序计算装置中的“加载待运行程序到内存模块”加载应用实例1程序到内存;
第4、程序计算装置中的“扫描待运行程序模块”扫描待运行程序(图6),针对受监控函数增加监控钩子函数代码(图8);
针对应用实例1,应用实例1(图6)中3次调用受监控函数f(),针对应用实例1程序(图6),增加受监控函数f()的监控钩子函数代码longlonghook_f(Unsignedintn),见图8中的第6至18行;然后将应用实例1(图6)中3次调用的“受监控函数f()”全部改为调用“受监控函数f()的监控钩子函数hook_f()”,见图8中的第4行(2处f())、第22行(1处f())变为hook_f()。
增加受监控函数f()的监控钩子函数代码hook_f方法有如下几种:
方法1.若运行程序有源代码的情况下,可以直接根据受监控函数f()的函数声明,增加一个与f()对应的新函数即监控钩子函数代码hook_f,hook_f的函数声明与f()的函数声明相同。hook_f函数的实现代码流程如图5所示,也即为本发明方法中的第7至13步骤。并将运行程序源代码中所有调用f()的语句改为调用hook_f语句。该方法局限于运行程序有源代码的情形,不具有普遍性;且该方法只能加快该运行程序本身执行效率。
方法2.不需要运行程序有源代码,直接针对运行程序的二进制代码(包括Java、C#的中间代码)进行改造。创建与受监控函数f()函数声明相同的监控钩子函数hook_f函数,并动态加载到运行程序的内存空间中,如图4所示原理。监控钩子函数hook_f函数的实现流程如图5所示,也即为本发明方法中的第7至13步骤。并进一步将运行程序中所有调用f()的调用指令作修改,用监控钩子函数hook_f的函数地址替换f()的函数地址。该方法具有通用性,且该方法可以加快多个运行程序执行的执行效率。
针对应用实例1,如图9所示,受监控函数f()的函数地址为0x4004dc,图9与图10中共有三处调用监控函数f(),只需将其改为监控钩子函数hook_f的函数地址即可。监控钩子函数hook_f的函数地址需要在动态加载监控钩子函数hook_f后获得,动态加载根据程序计算装置的不同操作系统平台采用不同的方法,如windows平台LoadLibrary、类UNIX平台dlopen。
方法3.不需要运行程序有源代码,直接针对运行程序的二进制代码(包括Java、C#的中间代码)增加受监控函数的监控钩子函数。创建与受监控函数f()函数声明相同的监控钩子函数hook_f函数,并动态加载到运行程序的内存空间中,如图4所示原理。受监控函数f()函数的实现流程如图5所示,也即为本发明方法中的第7至13步骤。运行程序执行过程中,扫描指令序列,当发现将要调用受监控函数f()的指令时(监控到调用受监控函数f()时),直接改为调用受监控函数f()的钩子函数hook_f即可。该方法具有通用性,且该方法可以加快多个运行程序执行的执行效率,同时不会对运行程序代码做任何改动。
本发明支持以上3种方法。
第5、程序计算装置中的“程序执行模块”执行应用实例1程序,直到执行到调用受监控函数点和程序结束点中的任意一个条件;
第6、若运程程序运行到程序结束点,则执行步骤14;
第7、若运行程序运行到调用受监控函数点,则首先调用监控钩子函数代码,即执行步骤8。
针对应用实例1,调用受监控函数点有3处,如图6中的第5行有2处)、第9行有1处f()。在此3处调用受监控函数点,
第8、监控钩子函数代码从持久存储设备读取并检索是否存在受监控函数及参数的历史执行结果,若存在受监控函数及参数的历史执行结果,则执行步骤9;否则执行步骤11;
针对应用实例1,检索是否存在受监控函数及参数的历史执行结果的函数为SearchHistroyResult(),该函数的返回值为true和false两种,为true时表明存在,为false时表明不存在。
如图7所示,当依次调用f(5),f(4),f(3),f(2),f(1),f(0)序列,各f()函数及参数均没有历史执行结果,因此需要直接调用f()本身代码;接下来依次调用f(1),f(2),f(1),f(0),f(3),f(2),f(1),f(0),f(1)时,各f()函数及参数均存在历史执行结果,因此不再需要直接调用f()本身代码,直接从持久存储设备获取受监控函数及参数的历史执行结果即可,例如f(1)执行结果存储的基本信息包括:函数唯一索引号;函数名:f;参数个数:2;{参数1名:n、参数1值:1};{参数2名:返回值、参数2值:1};函数执行的具体时间,其中最后一个参数的值就是f(1)的历史执行结果,即返回值1。
第9、监控钩子函数代码获取受监控函数及参数的历史执行结果,并赋给当前受监控函数的调用者;
针对应用实例1,获取受监控函数及参数的历史执行结果的函数为SearchHistroyResult(),该函数的ret参数即为受监控函数及参数的历史执行结果值。
第10、跳过对受监控函数实例的执行,进一步执行步骤13;
针对应用实例1,如图7所示,当依次调用f(5),f(4),f(3),f(2),f(1),f(0)序列,各f()函数及参数均没有历史执行结果,因此需要直接调用f()本身代码;接下来依次调用f(1),f(2),f(1),f(0),f(3),f(2),f(1),f(0),f(1)时,各f()函数及参数均存在历史执行结果,因此不再需要直接调用f()本身代码,直接将受监控函数及参数的历史执行结果赋值给SearchHistroyResult()函数中的ret参数,并进一步将ret参数的值赋给当前受监控函数的调用者。
第11、因为不存在受监控函数及参数的历史执行结果,因此直接执行受监控函数实例,获取执行结果,并赋给当前受监控函数的调用者;
针对应用实例1,如图7所示,当依次调用f(5),f(4),f(3),f(2),f(1),f(0)序列,各f()函数及参数均没有历史执行结果,因此需要直接调用f()本身代码。
第12、将当前受监控函数执行实例的参数及执行结果存储在持久存储设备中;
针对应用实例1,如图7所示,当依次调用f(5),f(4),f(3),f(2),f(1),f(0)序列,各f()函数及参数均没有历史执行结果,因此需要直接调用f()本身代码,并进一步将受监控函数执行实例的参数及执行结果存储在持久存储设备中,对于f(1)执行结果存储的基本信息包括:函数唯一索引号;函数名:f;参数个数:2;{参数1名:n、参数1值:1};{参数2名:返回值、参数2值:1};函数执行的具体时间。其它f(0),f(2),f(3),f(4),f(5)依次类推,例如f(5)执行结果存储的基本信息包括:函数唯一索引号、函数名:f;参数个数:2;{参数1名:n、参数1值:5};{参数2名:返回值、参数2值:5};函数执行的具体时间。
第13、继续执行程序,执行步骤5;
第14、程序运行结束。
当应用实例1再次运行时,按照前述本发明的方法,当执行到第5步骤时,首次达到调用受监控函数点,即调用f(5),此时转到调用受监控函数f()的监控钩子函数代码hook_f(5)。当执行到第8步骤时,监控钩子函数代码从持久存储设备读取并检索是否存在受监控函数及参数f(5)的历史执行结果,f(5)的历史执行结果已经存在于持久存储设备中,因此不需要再调用执行f(5)的代码,而直接从持久存储设备中获取f(5)的历史执行结果。应用实例1的第二次运行将只会调用如下斐波那契数列函数f()序列:f(5),而不是应用实例1首次运行时调用如下斐波那契数列函数f()序列:f(5),f(4),f(3),f(2),f(1),f(0),f(1),f(2),f(1),f(0),f(3),f(2),f(1),f(0),f(1)。而在应用实例1的第二次运行中f(5)本身代码也不需真正执行,因此大大减少了应用实例1实际运行的代码量,从而大大提高程序的运行效率。当应用实例1后续多次运行时都将大大减少了应用实例1实际运行的代码量,从而大大提高程序的运行效率。
当有其它程序实例X也调用了斐波那契数列函数f(),若该程序实例X实际调用了f(5),f(4),f(3),f(2),f(1),f(0)中的任何一个斐波那契数列函数f()实例,该程序实例X都将直接从持久存储设备中获取f()的历史执行结果,而不必再次执行f()本身代码,因此该程序实例X行时都将大大减少了实际运行的代码量,从而大大提高程序的运行效率。
考虑到在此公开的对本发明的描述和特例的实施例,本发明的其他实施例对于本领域的技术人员来说是显而意见的。这些说明和实施例仅作为例子来考虑,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (7)
1.基于持久存储既有计算结果来加速程序计算的方法,其特征在于,所述方法包括具体步骤如下:
第1、设定所要监控的函数;所述的设定所要监控的函数,是在操作系统运行下,任意时间动态设定所要监控的函数,包括增加新的监控函数、删除已有的监控函数,所有受监控的函数统称为“受监控函数集合”;每一个受监控函数的基本信息包括函数唯一索引号、函数名、参数个数、{参数名、参数类型}序列表、函数执行结果的有效时间,其中函数的返回值属于函数参数;
第2、获取受监控函数集合到内存;
第3、加载待运行程序到内存;
第4、扫描待运行程序并针对受监控函数增加监控钩子函数代码;
第5、执行程序,直到执行到调用受监控函数点和程序结束点中的任意一个条件;
第6、若程序运行到程序结束点,则执行步骤14;
第7、若运行程序执行到调用受监控函数点处,则调用监控钩子函数代码,即执行步骤8;
第8、监控钩子函数代码从持久存储设备读取并检索是否存在受监控函数及参数的历史执行结果,若存在受监控函数及参数的历史执行结果,则执行步骤9;否则执行步骤11;
第9、监控钩子函数代码获取受监控函数及参数的历史执行结果,并赋给当前受监控函数的调用者;
第10、跳过对受监控函数实例的执行,进一步执行步骤13;
第11、因为不存在受监控函数及参数的历史执行结果,因此直接执行受监控函数实例,获取执行结果,并赋给当前受监控函数的调用者;
第12、将当前受监控函数执行实例的参数及执行结果存储在持久存储设备中;所述的将当前受监控函数执行实例的参数及执行结果存储在持久存储设备中,受监控函数执行实例的参数及执行结果的存储基本信息包括函数唯一索引号、函数名、参数个数、{参数名,参数值}序列表、函数执行时间;为了快速检索,在函数唯一索引号、函数名、参数名关键字段建立索引;
第13、继续执行程序,执行步骤5;
第14、程序执行结束。
2.根据权利要求1所述的方法,其特征在于第4步所述的扫描待运行程序,是扫描待运行程序的源程序,或者扫描待运行程序的二进制程序代码,二进制程序代码也包括由Java、C#源代码生成的中间代码。
3.根据权利要求2所述的方法,其特征在于第4步所述的扫描待运行程序的源程序并增加监控钩子函数代码的方法为:首先增加一个与受监控函数对应的监控钩子函数代码,监控钩子函数与受监控函数的函数声明相同,监控钩子函数的实现代码流程为本发明方法中的第7至13步骤;最后将待运行程序源代码中所有调用受监控函数的语句改为调用监控钩子函数语句,其中监控钩子函数中调用受监控函数的语句除外。
4.根据权利要求2所述的方法,其特征在于,扫描待运行程序的二进制程序代码并增加监控钩子函数代码的方法1为:首先创建与受监控函数的函数声明相同的监控钩子函数,并动态加载到运行程序的内存空间中,监控钩子函数的实现代码流程为本发明方法中的第7至13步骤;最后将运行程序中所有调用受监控函数的调用指令作修改,用监控钩子函数的函数地址替换受监控函数的函数地址,其中监控钩子函数中调用受监控函数的语句除外。
5.根据权利要求2所述的方法,其特征在于,扫描待运行程序的二进制程序代码并增加监控钩子函数代码的方法2为:首先创建与受监控函数的函数声明相同的监控钩子函数,并动态加载到运行程序的内存空间中,监控钩子函数的实现代码流程为本发明方法中的第7至13步骤;运行程序执行过程中,扫描指令序列,当发现将要调用受监控函数的指令时,直接改为调用受监控函数的监控钩子函数,其中监控钩子函数中调用受监控函数的语句除外。
6.根据权利要求1所述的方法,其特征在于,第8、9、12步中所涉及的持久存储设备指在掉电情况下已保存的数据不会丢失的存储设备,包括磁盘、磁带存储设备,也包括具有持久存储能力的数据库。
7.基于持久存储既有计算结果来加速程序计算的系统,其特征在于,所述系统包括程序计算装置和受监控函数计算结果的持久存储装置;
程序计算装置包括:管理持久存储设备中受监控函数及参数的历史执行结果模块、检索受监控函数及参数的历史执行结果模块、设定所要监控的函数集合模块、获取受监控函数集合到内存模块、加载待运行程序到内存模块、扫描待运行程序,对受监控函数增加监控钩子模块、程序执行模块;所述的设定所要监控的函数,是在操作系统运行下,任意时间动态设定所要监控的函数,包括增加新的监控函数、删除已有的监控函数,所有受监控的函数统称为“受监控函数集合”;每一个受监控函数的基本信息包括函数唯一索引号、函数名、参数个数、{参数名、参数类型}序列表、函数执行结果的有效时间,其中函数的返回值属于函数参数;
持久存储装置包括:受监控函数及参数的历史执行结果管理模块、检索受监控函数及参数的历史执行结果模块、受监控函数信息管理模块、持久存储介质;检索受监控函数及参数的历史执行结果模块在程序计算装置中完成,或在受监控函数计算结果的持久存储装置中完成,或在程序计算装置和受监控函数计算结果的持久存储装置中协作完成;其中,将当前受监控函数执行实例的参数及执行结果存储在持久存储介质中,受监控函数执行实例的参数及执行结果的存储基本信息包括函数唯一索引号、函数名、参数个数、{参数名,参数值}序列表、函数执行时间;为了快速检索,在函数唯一索引号、函数名、参数名关键字段建立索引。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210496533.4A CN103019705B (zh) | 2012-11-28 | 2012-11-28 | 基于持久存储既有计算结果来加速程序计算的方法及系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210496533.4A CN103019705B (zh) | 2012-11-28 | 2012-11-28 | 基于持久存储既有计算结果来加速程序计算的方法及系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103019705A CN103019705A (zh) | 2013-04-03 |
CN103019705B true CN103019705B (zh) | 2015-12-02 |
Family
ID=47968344
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201210496533.4A Active CN103019705B (zh) | 2012-11-28 | 2012-11-28 | 基于持久存储既有计算结果来加速程序计算的方法及系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103019705B (zh) |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103577157B (zh) * | 2013-11-13 | 2016-04-13 | Tcl通讯(宁波)有限公司 | 一种移动终端计算器的计算方法和装置 |
CN106203119B (zh) * | 2016-07-13 | 2019-04-26 | 珠海豹趣科技有限公司 | 隐藏光标的处理方法、装置及电子设备 |
CN111274453A (zh) * | 2020-01-14 | 2020-06-12 | 北京市商汤科技开发有限公司 | 数据运行方法、系统、电子设备以及计算机可读存储介质 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101055566A (zh) * | 2007-05-25 | 2007-10-17 | 金蝶软件(中国)有限公司 | 一种电子数据表的函数收集方法和装置 |
CN102087613A (zh) * | 2009-12-08 | 2011-06-08 | 北京大学 | 用于函数执行的缓存方法和装置 |
CN102222108A (zh) * | 2011-06-28 | 2011-10-19 | 用友软件股份有限公司 | 脚本处理方法和脚本处理装置 |
CN102754104A (zh) * | 2010-01-29 | 2012-10-24 | 赛门铁克公司 | 在相关计算系统之间共享计算操作结果的系统和方法 |
-
2012
- 2012-11-28 CN CN201210496533.4A patent/CN103019705B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101055566A (zh) * | 2007-05-25 | 2007-10-17 | 金蝶软件(中国)有限公司 | 一种电子数据表的函数收集方法和装置 |
CN102087613A (zh) * | 2009-12-08 | 2011-06-08 | 北京大学 | 用于函数执行的缓存方法和装置 |
CN102754104A (zh) * | 2010-01-29 | 2012-10-24 | 赛门铁克公司 | 在相关计算系统之间共享计算操作结果的系统和方法 |
CN102222108A (zh) * | 2011-06-28 | 2011-10-19 | 用友软件股份有限公司 | 脚本处理方法和脚本处理装置 |
Non-Patent Citations (2)
Title |
---|
《JavaScript Memoization:让函数也有记忆功能》;Dexter.Yy;《YY in Limbo》;20080427;全文 * |
karry.《javascript中的memoization(memoizing) 技术介绍》.《Play Google》.2009,全文. * |
Also Published As
Publication number | Publication date |
---|---|
CN103019705A (zh) | 2013-04-03 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Lu et al. | A new exact algorithm for the weapon-target assignment problem | |
CN103019705B (zh) | 基于持久存储既有计算结果来加速程序计算的方法及系统 | |
WO2021057252A1 (zh) | 一种业务处理流程配置方法、业务请求处理方法及装置 | |
CN112783974A (zh) | 数据转换方法、装置、设备和存储介质 | |
CN112783912B (zh) | 一种数据处理方法、装置、计算机设备及存储介质 | |
CN108762751A (zh) | 一种逻辑图形组态及转成数据流的方法及系统 | |
CN114217886A (zh) | 一种函数调用方法、计算设备及存储介质 | |
CN107577609A (zh) | 一种基于主机端动态链接的嵌入式系统动态模块调试方法 | |
CN110569312A (zh) | 一种基于gpu的大数据快速检索系统及其使用方法 | |
CN107483412B (zh) | 一种HTML5 web worker迁移方法及系统 | |
CN113900896B (zh) | 一种代码运行的监测方法、装置、设备及存储介质 | |
CN102915344A (zh) | 一种sql语句处理方法及装置 | |
CN115858205A (zh) | 基于内存黑板机制的仿真组件交互方法、装置和设备 | |
CN103488517A (zh) | Php代码编译方法、php代码运行方法及装置 | |
CN114327481A (zh) | 代码处理方法、装置、设备以及存储介质 | |
CN109254989B (zh) | 一种基于元数据驱动的弹性etl架构设计的方法及装置 | |
CN107679701B (zh) | 负荷削减并行计算方法及装置 | |
CN108932407B (zh) | 一种程序安全保护方法及装置 | |
JP2014191493A (ja) | プログラム実行制御プログラム、プログラム実行制御方法 | |
CN106371808A (zh) | 一种并行计算的方法及终端 | |
CN111708576A (zh) | 跨操作系统的设备网卡适配和管理方法、装置及系统 | |
CN111831323A (zh) | 容器化的增量持续交付方法 | |
CN102981856B (zh) | 基于网络的程序计算结果存储与检索方法及系统 | |
CN111107062A (zh) | 一种基于贪婪算法的游戏资源打包方法及系统 | |
CN115237390A (zh) | 一种继电保护装置逻辑图生成代码方法、装置及存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |