CN110990271A - 代码性能检测方法、装置、设备及存储介质 - Google Patents

代码性能检测方法、装置、设备及存储介质 Download PDF

Info

Publication number
CN110990271A
CN110990271A CN201911190460.4A CN201911190460A CN110990271A CN 110990271 A CN110990271 A CN 110990271A CN 201911190460 A CN201911190460 A CN 201911190460A CN 110990271 A CN110990271 A CN 110990271A
Authority
CN
China
Prior art keywords
code
target
function
performance
statement
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.)
Pending
Application number
CN201911190460.4A
Other languages
English (en)
Inventor
林全昌
卢道和
林挺
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
WeBank Co Ltd
Original Assignee
WeBank Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by WeBank Co Ltd filed Critical WeBank Co Ltd
Priority to CN201911190460.4A priority Critical patent/CN110990271A/zh
Publication of CN110990271A publication Critical patent/CN110990271A/zh
Priority to PCT/CN2020/128337 priority patent/WO2021104027A1/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/366Software debugging using diagnostics
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/3628Software debugging of optimised code

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Debugging And Monitoring (AREA)

Abstract

本发明公开了一种代码性能检测方法、装置、设备及存储介质,该方法通过获取包含有能够检测到目标语句块性能的预设性能统计代码,使得代码性能检测的对象细化到了待检测源码中的部分语句,突破了现有技术中仅能将待检测代码中的函数作为最小细化对象的限制;通过将预设性能统计代码注入待检测源码,使得待检测源码中的目标语句块的性能能够通过预设性能统计代码进行检测;获取第一、第二性能统计数据,能够了解到目标代码中函数内部的执行情况,并根据这一执行情况对目标代码进行较之现有方案更为细致的性能分析,提高了代码性能检测结果的精确度。

Description

代码性能检测方法、装置、设备及存储介质
技术领域
本发明涉及金融科技(Fintech)技术领域,尤其涉及代码性能检测方法、装置、设备及计算机可读存储介质。
背景技术
随着计算机技术的发展,越来越多的技术应用在金融领域,传统金融业正在逐步向金融科技(Fintech)转变,但由于金融行业的安全性、实时性要求,也对技术提出了更高的要求。对于银行的前端系统,前端开发通常运用JavaScript进行代码编写,为提高代码运行效率,就需要对运用JavaScript编写的代码进行性能检测,并通过检测结果对代码的性能优劣进行分析,进而对性能不佳的代码进行优化。由于JavaScript是解析型语言,要想收集运行时的信息来进行动态程序分析,现有技术中有两种实现方案:一种是通过JavaScript引擎内部提供的收集运行数据的接口,实现一段时间内JavaScript代码运行数据的导出;另一种对编译后的源码注入运行数据收集代码来收集运行数据。但第一种实现方案仅适用于大型的复杂项目代码,且得到的是所检测代码中函数的性能统计数据,故仅能体现出所检测代码的函数层面的性能优劣;而第二种实现方案因专为小型代码片段而设计,故无法运用于大型或中型程序代码的性能检测,且运用第二种实现方案仅能比较所检测代码片段的性能优劣,用户通过检测结果也仅能定性地判断出所检测的多个代码片段的性能优劣与否,从上述两种实现方案中均无从得知造成代码片段性能不佳的具体原因,从而导致了现有代码性能检测结果的精确度低的问题。
发明内容
本发明的主要目的在于提出一种代码性能检测方法、装置、设备及计算机可读存储介质,旨在解决了现有代码性能检测结果的精确度低的技术问题。
为实现上述目的,本发明提供一种代码性能检测方法,所述代码性能检测方法包括:
在接收到性能检测指令时,获取待检测源码与预设性能统计代码,并确定所述待检测源码中的目标函数以及所述目标函数中的目标语句块;
基于所述目标函数与目标语句块在所述待检测源码中的目标位置信息,将所述性能统计代码注入所述待检测源码中的目标注入位置,将已注入的待检测源码作为目标代码;
执行所述目标代码,并基于所述性能统计代码中的执行统计代码与行计数统计代码,分别获取所述目标函数的第一性能数据与所述目标语句块的第二性能数据;
根据所述第一性能数据与第二性能数据,确定所述目标函数中的待优化函数以及所述待优化函数中的待优化语句。
可选地,所述确定所述待检测源码中的目标函数以及所述目标函数中的目标语句块的步骤具体包括:
从所述性能统计代码中获取与所述目标函数相关的第一正则表达式以及与所述目标语句块对应的第二正则表达式,并将所述第一正则表达式与第二正则表达式逐行匹配所述待检测源码;
在所述待检测源码中存在与所述第一正则表达式相匹配的第一部分代码时,判定所述第一部分代码为所述目标函数的执行语句,并根据所述执行语句确定所述目标函数;
在所述待检测源码中存在与所述第二正则表达式相匹配的第二部分代码时,判定所述第二部分代码为所述目标语句块。
可选地,所述基于所述目标函数与目标语句块在所述待检测源码中的目标位置信息,将所述性能统计代码注入所述待检测源码中的目标注入位置,将已注入的待检测源码作为目标代码的步骤具体包括:
获取所述执行语句的第一位置信息以及所述目标语句块的第二位置信息,将所述第一位置信息与第二位置信息作为所述目标位置信息;
基于所述目标位置信息,确定所述执行统计代码与行计数统计代码分别对应的第一注入位置与第二注入位置,将所述第一注入位置与第二注入位置作为所述目标注入位置;
将所述性能统计代码注入所述目标注入位置,将已注入待检测源码作为所述目标代码。
可选地,所述获取所述执行语句的第一位置信息以及所述目标语句块的第二位置信息,将所述第一位置信息与第二位置信息作为所述目标位置信息的步骤之后,还包括:
判断所述目标语句块中是否存在特定语句;
若所述目标语句块中存在所述特定语句,则将所述特定语句所在的位置作为所述第二注入位置,并将所述行计数统计代码注入所述第二注入位置;
若所述目标语句块中不存在所述特定语句,则在所述目标语句块中添加所述特定语句,并重复执行步骤:将所述特定语句所在的位置作为所述第二注入位置,并将所述行计数统计代码注入所述第二注入位置。
可选地,所述根据所述第一性能数据与第二性能数据,确定所述目标函数中的待优化函数以及所述待优化函数中的待优化语句的步骤具体包括:
获取所述第一性能数据中的函数执行次数与函数执行时间,并判断所述函数执行次数与函数执行时间是否分别超出预设第一阈值与预设第二阈值;
若所述函数执行次数超出所述第一阈值且所述函数执行时间超出所述第二阈值,则判定超出所述第一阈值和第二阈值的数据所对应的函数为待优化函数;
获取所述第二性能数据中与所述待优化函数对应的目标语句块执行次数,并判断所述目标语句块执行次数是否超出预设第三阈值;
若所述目标语句块执行次数超出所述第三阈值,则判定超出所述第三阈值的数据对应的语句为待优化语句。
可选地,所述在接收到性能检测指令时,获取待检测源码与预设性能统计代码,并确定所述待检测源码中的目标函数以及所述目标函数中的目标语句块的步骤具体包括:
在接收到所述性能检测指令时,获取所述性能检测指令中的原始代码,并判断所述原始代码中是否存在待执行函数;
若所述原始代码中存在所述待执行函数,则判定所述原始代码为所述待检测源码,并获取所述性能统计代码;
根据所述性能统计代码,确定所述目标函数与目标语句块。
可选地,所述根据所述第一性能数据与第二性能数据,确定所述目标函数中的待优化函数以及所述待优化函数中的待优化语句的步骤之前,还包括:
根据预设权重、所述目标函数的函数执行次数与函数执行时间,生成每一目标函数的性能参考值,其中,所述函数执行次数与函数执行时间为所述第二性能数据;
按照所述性能参考值从高到低显示目标函数名称以及对应的函数执行次数与函数执行时间;
按照目标语句块执行次数从大到小的顺序依次显示目标语句块名称以及对应的目标语句块执行次数,其中,所述目标语句块执行次数为所述第一性能数据。
如上述的代码性能检测方法,所述代码检测方法还包括:
获取所述目标代码中的工具函数与所述性能统计代码中的性能统计函数,并将所述工具函数与性能统计函数作为统计工具函数;
将所述统计工具函数写入指定文件,以基于所述指定文件中的所述统计工具函数对下一待检测的代码进行性能数据统计。
此外,为实现上述目的,本发明还提供一种代码性能检测装置,所述代码性能检测装置包括:
所述代码性能检测装置包括:
函数语句确定模块,用于在接收到性能检测指令时,获取待检测源码与预设性能统计代码,并确定所述待检测源码中的目标函数以及所述目标函数中的目标语句块;
性能代码注入模块,用于基于所述目标函数与目标语句块在所述待检测源码中的目标位置信息,将所述性能统计代码注入所述待检测源码中的目标注入位置,将已注入的待检测源码作为目标代码;
性能数据获取模块,用于执行所述目标代码,并基于所述性能统计代码中的执行统计代码与行计数统计代码,分别获取所述目标函数的第一性能数据与所述目标语句块的第二性能数据;
优化语句确定模块,用于根据所述第一性能数据与第二性能数据,确定所述目标函数中的待优化函数以及所述待优化函数中的待优化语句。
可选地,所述代码性能检测装置还包括:
正则获取匹配模块,用于从所述性能统计代码中获取与所述目标函数相关的第一正则表达式以及与所述目标语句块对应的第二正则表达式,并将所述第一正则表达式与第二正则表达式逐行匹配所述待检测源码;
第一正则匹配模块,用于在所述待检测源码中存在与所述第一正则表达式相匹配的第一部分代码时,判定所述第一部分代码为所述目标函数的执行语句,并根据所述执行语句确定所述目标函数;
第二正则匹配模块,用于在所述待检测源码中存在与所述第二正则表达式相匹配的第二部分代码时,判定所述第二部分代码为所述目标语句块。
可选地,所述性能代码注入模块具体包括:
位置信息获取单元,用于获取所述执行语句的第一位置信息以及所述目标语句块的第二位置信息,将所述第一位置信息与第二位置信息作为所述目标位置信息;
注入位置确定单元,用于基于所述目标位置信息,确定所述执行统计代码与行计数统计代码分别对应的第一注入位置与第二注入位置,将所述第一注入位置与第二注入位置作为所述目标注入位置;
性能代码注入单元,用于将所述性能统计代码注入所述目标注入位置,将已注入待检测源码作为所述目标代码。
可选地,所述代码性能检测装置还包括:
特定语句判断模块,用于判断所述目标语句块中是否存在特定语句;
代码直接注入模块,用于若所述目标语句块中存在所述特定语句,则将所述特定语句所在的位置作为所述第二注入位置,并将所述行计数统计代码注入所述第二注入位置;
代码间接注入模块,用于若所述目标语句块中不存在所述特定语句,则在所述目标语句块中添加所述特定语句,并重复执行步骤:将所述特定语句所在的位置作为所述第二注入位置,并将所述行计数统计代码注入所述第二注入位置。
可选地,所述性能数据获取模块具体包括:
函数数据判断单元,用于获取所述第一性能数据中的函数执行次数与函数执行时间,并判断所述函数执行次数与函数执行时间是否分别超出预设第一阈值与预设第二阈值;
优化函数确定单元,用于若所述函数执行次数超出所述第一阈值且所述函数执行时间超出所述第二阈值,则判定超出所述第一阈值和第二阈值的数据所对应的函数为待优化函数;
语句数据判断单元,用于获取所述第二性能数据中与所述待优化函数对应的目标语句块执行次数,并判断所述目标语句块执行次数是否超出预设第三阈值;
优化语句确定单元,用于若所述目标语句块执行次数超出所述第三阈值,则判定超出所述第三阈值的数据对应的语句为待优化语句。
此外,为实现上述目的,本发明还提供一种代码性能检测设备,所述代码性能检测设备包括:存储器、处理器及存储在所述存储器上并可在所述处理器上运行的代码性能检测程序,所述代码性能检测程序被所述处理器执行时实现如上所述的代码性能检测方法的步骤。
此外,为实现上述目的,本发明还提供一种计算机可读存储介质,所述计算机可读存储介质上存储有代码性能检测程序,所述代码性能检测程序被处理器执行时实现如上所述的代码性能检测方法的步骤。
本发明通过获取包含有能够定位到代码中具体语句,进而检测到目标语句块性能的预设性能统计代码,使得代码性能检测的对象细化到了待检测源码中的部分语句,突破了现有技术中仅能将待检测代码中的函数作为最小细化对象的限制;通过将预设性能统计代码注入待检测源码,使得待检测源码中的目标语句块的性能能够通过预设性能统计代码进行检测;根据获取第一、第二性能统计数据,使得用户能够了解到目标代码中函数内部的执行情况,并根据这一执行情况对目标代码进行较之现有方案更为细致的性能分析;通过确定待优化函数中的待优化语句,使得用户能够得到比起整个函数更为精确的优化目标,尤其是对于经验不足的程序员而言,通过现有的代码性能检测结果对目标代码性能优劣的决定因素进行分析的难度较大,而通过本发明能够直接获取到目标语句块的执行情况,进而快速分析出导致代码性能不佳的具体原因,提高了代码性能检测结果的精确度,从而解决了现有代码性能检测结果的精确度低的技术问题。
附图说明
图1是本发明实施例方案涉及的硬件运行环境的设备结构示意图;
图2为本发明代码性能检测方法第一实施例的流程示意图。
本发明目的的实现、功能特点及优点将结合实施例,参照附图做进一步说明。
具体实施方式
应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
如图1所示,图1是本发明实施例方案涉及的硬件运行环境的设备结构示意图。
本发明实施例代码性能检测装置可以是PC机或服务器设备,其上运行有Java虚拟机。
如图1所示,该代码性能检测装置可以包括:处理器1001,例如CPU,网络接口1004,程序员接口1003,存储器1005,通信总线1002。其中,通信总线1002用于实现这些组件之间的连接通信。程序员接口1003可以包括显示屏(Display)、输入单元比如键盘(Keyboard),可选程序员接口1003还可以包括标准的有线接口、无线接口。网络接口1004可选的可以包括标准的有线接口、无线接口(如WI-FI接口)。存储器1005可以是高速RAM存储器,也可以是稳定的存储器(non-volatile memory),例如磁盘存储器。存储器1005可选的还可以是独立于前述处理器1001的存储装置。
本领域技术人员可以理解,图1中示出的设备结构并不构成对设备的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。
如图1所示,作为一种计算机存储介质的存储器1005中可以包括操作系统、网络通信模块、程序员接口模块以及代码性能检测程序。
在图1所示的设备中,网络接口1004主要用于连接后台服务器,与后台服务器进行数据通信;程序员接口1003主要用于连接客户端(程序员端),与客户端进行数据通信;而处理器1001可以用于调用存储器1005中存储的代码性能检测程序,并执行下述代码性能检测方法中的操作。
基于上述硬件结构,提出本发明代码性能检测方法实施例。
参照图2,图2为本发明代码性能检测方法第一实施例的流程示意图,所述代码性能检测方法包括:
步骤S10,在接收到性能检测指令时,获取待检测源码与预设性能统计代码,并确定所述待检测源码中的目标函数以及所述目标函数中的目标语句块;
目前,对于JavaScript编写的代码,要想收集运行时信息来进行动态程序分析,现有技术中有两种实现方案:一种是通过JavaScript引擎内部提供的收集运行数据的接口,实现一段时间内JavaScript代码运行数据的导出;另一种对编译后的源码注入运行数据收集代码来收集运行数据。但第一种实现方案仅适用于大型的复杂项目代码,且得到的是所检测代码中函数的性能统计数据,故仅能体现出所检测代码的函数层面的性能优劣;而第二种实现方案因专为小型代码片段而设计,故无法运用于大型或中型程序代码的性能检测,且运用第二种实现方案仅能比较所检测代码片段的性能优劣,用户通过检测结果也仅能定性地判断出所检测的多个代码片段的性能优劣与否,而无从得知造成代码片段性能不佳的具体原因,从而导致了现有代码性能检测结果的精确度低的问题。例如,当前待检测的源代码为一个包含有耦合了多个功能的搭函数的中型程序代码,若运用v8-profiler来对这一源代码进行性能分析,会耗费较长的时间才能得到这一源代码的执行统计数据,而执行统计数据当中,CPU占用率等数据对中小型程序代码的性能分析并无帮助,且执行统计数据当中关于程序中函数的执行数据也仅能定性地判断出函数的性能优劣。此时程序员根据检测结果得知这一大函数的性能不佳,严重影响了整个程序的性能,但从检测结果当中无法获取到更加详细的信息来确定导致性能不佳的具体原因,程序员就需要花费较长时间才能分析出这一大函数中哪些关键语句可以更改。
在本实施例中,为解决上述问题,本发明提供一种代码性能检测方法,即本发明通过获取包含有能够检测到目标语句块性能的预设性能统计代码,使得代码性能检测的对象细化到了待检测源码中的部分语句,突破了现有技术中仅能将待检测代码中的函数作为最小细化对象的限制;通过将预设性能统计代码注入待检测源码,使得待检测源码中的目标语句块的性能能够通过预设性能统计代码进行检测;根据获取第一、第二性能统计数据,使得用户能够了解到目标代码中函数内部的执行情况,并根据这一执行情况对目标代码进行较之现有方案更为细致的性能分析;通过确定待优化函数中的待优化语句,使得用户能够得到比起整个函数更为精确的优化目标,尤其是对于经验不足的程序员而言,通过现有的代码性能检测结果对目标代码性能优劣的决定因素进行分析的难度较大,而通过本发明能够直接获取到目标语句块的执行情况,进而快速分析出导致代码性能不佳的具体原因,提高了代码性能检测结果的精确度,从而解决了现有代码性能检测结果的精确度低的技术问题。所述代码性能检测方法应用于装有Node.js(一种基于Chrome V8引擎的JavaScript运行环境)的终端。
性能检测指令可以是程序员导入待检测源码与预设性能统计代码所发起的,也可以由终端根据预置指令自动发起。预设性能统计代码包括行计数统计代码、执行统计代码和相关正则表达式,用于匹配所述待检测源码中的目标语句块和目标函数并检测其性能,是事先编写完成的通用于大部分代码的性能统计代码;对于小部分较为复杂的源代码,可事先对预设性能统计代码进行优化后再使用。目标语句块包括但不限于循环语句、选择语句、判断语句、返回语句等关键语句。目标函数为待检测源码中需要执行的所有函数。具体地,用户通过导入当前的一个中型程序代码作为待检测源码,与通用的性能统计代码,向装有Node.js的计算机发起一个代码性能检测指令。计算机接收到代码性能检测指令,获取这一性能检测指令中的待检测源码与预设性能统计代码。计算机从预设性能统计代码中获取正则表达式,并通过上述正则表达式逐行匹配这一待检测源码,从而确定这一待检测源码中的目标函数以及目标函数中的关键语句。
步骤S20,基于所述目标函数与目标语句块在所述待检测源码中的目标位置信息,将所述性能统计代码注入所述待检测源码中的目标注入位置,将已注入的待检测源码作为目标代码;
其中,目标位置信息包括目标函数在待检测源码中的第一位置信息与目标语句块在待检测源码中的第二位置信息。目标注入位置包括执行统计代码对应在待检测源码中的第一注入位置与行计数统计代码对应在待检测源码中的第二注入位置。
在本实施例中,装有Node.js的终端将上述的性能统计代码注入待检测源码的相应位置。需要说明的是,性能统计代码注入前后待检测源码的语意不会发生改变。具体地,性能统计代码包括行计数统计代码与执行统计代码。行计数统计代码通过在执行上下文注入一个全局对象count,以语句类型type+源码行数line+源码列数column作为对象的键key,执行次数作为值value记录语句执行次数。语句类型有if、else if、else、for、while、return等关键语句。首次进行计数时初始化键值对为1,后续不断叠加。执行统计代码通过在函数前后注入performance.now()语句,获取函数执行前后的系统时间开始时间和结束时间。两个数值相减即可得出对应函数的执行时间,且每得出一个函数执行时间,则表明执行一次。即可获取函数执行时间与执行次数。获取到执行时间和执行次数后,通过全局变量profile记录函数执行次数和执行时间。计算机将行计数统计代码封装成lineCounter函数,并接收三个参数type(语句类型)、line(源码行数)、column(源码列数),这一函数返回undefined(未定义)参数;也将执行统计代码封装成functionProfiler函数,接收两个参数:functionName(函数名字)、time(函数执行时间)。需要说明的是,为了防止命名冲突,JavaScript内置的函数将会加上对应的对象名字。例如Math.sqrt会转化为Math_sqrt,对于匿名函数会统一用_selfExecution代替。计算机将行计数统计代码注入待检测源码中的循环语句、判断语句、返回语句等关键语句的相应位置,并将执行统计代码注入待检测源码中执行函数前后的对应位置。
更多实施例中,预设性能统计代码的注入方式还可为将待检测源码分析为抽象语法树,再将相应的目标语句块注入预设性能统计代码,最后生成目标代码;或者可将这一功能下沉到JavaScript解析引擎,由JavaScript解析引擎输出对应的行计数结果。但抽象语法树的解析过程需要花费人力物力,成本较高,而JavaScript解析引擎需要将目标代码嵌入引擎,在线分析代码,可能影响到代码的性能。
步骤S30,执行所述目标代码,并基于所述性能统计代码中的执行统计代码与行计数统计代码,分别获取所述目标函数的第一性能数据与所述目标语句块的第二性能数据;
其中,执行统计代码用于统计待检测源码中目标函数的第一性能数据,行计数统计代码用于统计目标函数中目标语句块的第二性能数据。第一性能数据可为目标语句块的执行次数与执行时间。第二性能数据包括但不限于目标函数的执行次数、总执行时间以及平均执行时间。
在本实施例中,终端基于Node.js这一运行环境执行目标代码,并获取执行结果中的性能统计数据。具体地,在目标代码执行过程中,计算机读取目标代码中全局对象count的数据,解析出目标语句块的执行次数、行数和列数,即值value和键key中的line和column,并在目标代码对应的行前面写入执行次数。接着读取目标代码中全局对象profile的数据,解析出对应函数的总执行时间与执行次数,并通过总执行时间与执行次数得到函数对应的平均执行时间。需要说明的是,本发明中仅对整个函数以及目标语句块也即是关键语句进行性能检测,而不对函数中的全部语句进行性能检测,一是因为对全部语句进行检测耗时较长,二是因为对全部语句进行检测所得到的检测数据大部分对问题的分析并无帮助,且还有可能会对问题的分析产生干扰。
步骤S40,根据所述第一性能数据与第二性能数据,确定所述目标函数中的待优化函数以及所述待优化函数中的待优化语句。
在本实施例中,待优化函数以及待优化语句可以是终端对第一性能数据与第二性能数据进行分析后确定,也可通过将第一性能数据与第二性能数据显示给用户后由用户来确定。具体地,计算机对第一性能数据进行分析,将满足预设条件的数据对应的函数确定为待优化函数后,获取第二性能数据中待优化函数对应的数据,并对待优化函数对应的数据进行分析,将目标语句块中超出预设阈值的数据对应的语句确定为待优化语句。
本发明通过获取包含有能够定位到代码中具体语句,进而检测到目标语句块性能的预设性能统计代码,使得代码性能检测的对象细化到了待检测源码中的部分语句,突破了现有技术中仅能将待检测代码中的函数作为最小细化对象的限制;通过将预设性能统计代码注入待检测源码,使得待检测源码中的目标语句块的性能能够通过预设性能统计代码进行检测;根据获取第一、第二性能统计数据,使得用户能够了解到目标代码中函数内部的执行情况,并根据这一执行情况对目标代码进行较之现有方案更为细致的性能分析;通过确定待优化函数中的待优化语句,使得用户能够得到比起整个函数更为精确的优化目标,尤其是对于经验不足的程序员而言,通过现有的代码性能检测结果对目标代码性能优劣的决定因素进行分析的难度较大,而通过本发明能够直接获取到目标语句块的执行情况,进而快速分析出导致代码性能不佳的具体原因,提高了代码性能检测结果的精确度,从而解决了现有代码性能检测结果的精确度低的技术问题。
图中未示的,基于上述图2所示的第一实施例,提出本发明代码性能检测方法的第二实施例。
在本实施例中,在步骤S10具体包括:
步骤a,从所述性能统计代码中获取与所述目标函数相关的第一正则表达式以及与所述目标语句块对应的第二正则表达式,并将所述第一正则表达式与第二正则表达式逐行匹配所述待检测源码;
在本实施例中,程序员通过分析目标语句块所处的语意环境,写出与待检测源码中函数执行代码对应的第一正则表达式,以及与关键语句对应的第二正则表达式,并将上述正则表达式输入终端。终端获取到上述第一、第二正则表达式,在执行目标代码的过程中,通过上述第一、第二正则表达式逐行匹配每一行代码。具体地,以选择语句if为例,if语句在代码中有两种表现形式,一种是if(){},另一种是if(){},程序员则编写出与if语句对应的正则表达式/$\s+if\s+?\(*.\)/,计算机用这一正则表达式逐行匹配,以寻找待检测源码中的if语句。
步骤b,在所述待检测源码中存在与所述第一正则表达式相匹配的第一部分代码时,判定所述第一部分代码为所述目标函数的执行语句,并根据所述执行语句确定所述目标函数;
在本实施例中,若匹配过程结束,结果显示待检测源码中存在与上述第一正则表达式相匹配的第一部分代码,则终端可判定上述第一部分代码即为待检测源码中函数的执行语句。具体地,若匹配结果显示待检测源码中存在六处与所述第一正则表达式相匹配的代码,则判定这六处代码均为函数的执行语句,也即为待检测源码中存在六个需要执行的函数。
步骤c,在所述待检测源码中存在与所述第二正则表达式相匹配的第二部分代码时,判定所述第二部分代码为所述目标语句块。
在本实施例中,若匹配过程结束,结果显示待检测源码中存在与上述正则表达式相匹配的第二部分代码,则终端可判定上述第二部分代码即为所要寻找的目标语句块。具体地,计算机用/$\s+if\s+?\(*.\)/逐行匹配待检测源码,匹配结果显示待检测源码中存在五处与这一正则表达式匹配的代码,则即可判定这五处代码均为判断语句if的代码。
进一步地,在本实施例中,步骤c之后,还包括:
步骤d,获取所述执行语句的第一位置信息以及所述目标语句块的第二位置信息,将所述第一位置信息与第二位置信息作为所述目标位置信息;
在本实施例中,终端获取目标语句块对应在待检测源码中的第一位置信息,其中,第一位置信息通常为函数执行语句的行数与列数。并获取待检测源码中目标语句块的第二位置信息,第二位置信息通常为目标语句块的行数与列数。
步骤e,基于所述目标位置信息,确定所述执行统计代码与行计数统计代码分别对应的第一注入位置与第二注入位置,将所述第一注入位置与第二注入位置作为所述目标注入位置;
其中,第一注入位置在不同类型关键语句中的位置不同,第二注入位置为函数的执行语句前后的位置。
在本实施例中,终端根据上述第一位置信息与第二位置信息,确定行计数统计代码在待检测源码中的第一注入位置,以及执行统计代码中的第二注入位置。具体地,计算机用第一正则表达式逐行匹配待检测源码,将匹配成功的语句判定为上述函数对应的函数执行代码,并在函数执行代码前注入const__start=performance.now();语句,并在函数执行代码后注入const__end=performance.now();语句。函数执行代码前后位置即为上述第一注入位置。以目标语句块为判断语句if为例,计算机获取一判断语句if()的行数与列数,并根据这一行数和列数,用lineCounter函数替换这一if()语句中最前面的“(”,这一位置即为上述第二注入位置,并将注入完成的代码写入js_profile_code.js文件中。更多实施例中,判断语句else if、循环语句for、while均有“()”判断语句是否执行,则注入方式与上述if语句的注入方式一致。对于返回语句return,计算机直接在匹配判定出的return语句前插入lineCounter函数即可完成注入。
步骤f,将所述性能统计代码注入所述目标注入位置,将已注入待检测源码作为所述目标代码。
在本实施例中,终端将执行统计代码注入已确定的第一注入位置,将行计数统计代码注入已确定的第二注入位置。完成注入操作后,终端将已注入有执行统计代码与行计数统计代码的待检测源码作为即将运行的目标代码。
进一步地,步骤d之后,还包括:
步骤g,判断所述目标语句块中是否存在特定语句;
在本实施例中,终端通过检测并匹配,判断每个判定为目标语句块的代码中是否存在特定语句。其中,特定语句为关键语句中else语句的“{}”包括的语句。
步骤h,若所述目标语句块中存在所述特定语句,则将所述特定语句所在的位置作为所述第一注入位置,并将所述行计数统计代码注入所述第一注入位置;
在本实施例中,若终端判定当前这一目标语句块中存在特定语句,则将行计数统计代码注入特定语句所在的第一注入位置。具体地,若经判定这一else语句中存在“{}”包括的语句,则计算机将lineCounter函数注入这一语句当中,这一位置即为上述第一注入位置。
步骤i,若所述目标语句块中不存在所述特定语句,则在所述目标语句块中添加所述特定语句,并重复执行步骤:将所述特定语句所在的位置作为所述第一注入位置,并将所述行计数统计代码注入所述第一注入位置。
在本实施例中,若终端判定当前这一目标语句块中不存在特定语句,则将特定语句添加进这一目标语句块,再将行计数统计代码注入特定语句所在的第一注入位置。具体地,若经判定这一else语句中不存在“{}”包括的语句,则计算机在这一else语句中添加这一特定语句,再将行计数统计代码注入这一特定语句所在的第一注入位置。
本发明提供一种代码性能检测方法,所述代码性能检测方法进一步通过正则表达式匹配待检测源码中函数的执行语句以及目标语句块,提高了识别代码中函数与目标语句块的效率与准确度;将行计数统计代码与执行统计代码注入待检测源码的对应位置,使得行计数统计代码与执行统计代码能够正常运行并统计出目标语句块与函数的性能数据,实现了更为细化的代码性能检测;通过识别特定语句,使得能够精准地确定行计数统计代码在else语句中的注入位置,提高了代码注入的准确度。
图中未示的,基于上述图2所示的第一实施例,提出本发明代码性能检测方法的第三实施例。
在本实施例中,在步骤S40具体包括:
步骤j,获取所述第一性能数据中的函数执行次数与函数执行时间,并判断所述函数执行次数与函数执行时间是否分别超出预设第一阈值与预设第二阈值;
其中,函数执行时间包括函数执行总时间与函数平均执行时间。预设第一阈值为界定函数执行次数优劣的数值,预设第二阈值为界定函数执行时间优劣的时间值,且在本实施例中预设第二阈值可设置为预设平均执行时间阈值与预设执行总时间阈值两种不同的值,上述三种阈值均可根据具体情况灵活设定,本实施例对其不做具体限定。
在本实施例中,终端将执行统计代码注入待检测源码中的对应位置后,通过运行目标代码,获取待检测源码中所有执行的函数的执行次数以及执行行总时间,并计算出每一函数的平均执行时间。并将这些数据与预设第一阈值、预设平均执行时间阈值、预设执行总时间阈值比较。具体地,计算机获取并显示出第二性能数据为:main函数的执行次数为1,执行总时间为18.17299ms,平均执行时间为18.17299ms;prime函数的执行次数为999,执行总时间为14.78644ms,平均执行时间为0.01480ms;Math_sqrt函数的执行次数为999,执行总时间为0.41335ms,平均执行时间为0.00041ms。以预设平均执行时间阈值为1ms,预设第一阈值为500,预设执行总时间阈值为10ms为例,判断上述数据是否超出阈值。
步骤k,若所述函数执行次数超出所述第一阈值且所述函数执行时间超出所述第二阈值,则判定超出所述第一阈值和第二阈值的数据所对应的函数为待优化函数;
在本实施例中,沿用上述具体实施例中的数据,从上述数据中可知main函数中的函数执行次数、函数执行总时间以及函数平均执行时间均超出阈值,则判定main函数为待优化函数;prime函数中的函数执行次数与函数总时间超出阈值,而平均执行时间未超出阈值,则判定prime函数为待优化函数;Math_sqrt函数中仅有函数执行次数超出阈值,而函数执行中时间与函数平均执行时间均未超出阈值,则判定Math_sqrt函数不需要优化。
步骤l,获取所述第二性能数据中与所述待优化函数对应的目标语句块执行次数,并判断所述目标语句块执行次数是否超出预设第三阈值;
其中,预设第三阈值为判定待优化语句的执行次数的值,并根据具体情况灵活设定。
在本实施例中,终端根据在目标函数中确定的待优化函数,获取每一待优化函数对应的关键语句的执行次数。终端将预设第三阈值与关键语句的执行次数进行比较。具体地,沿用上述实施例,设定当前计算机获取到在main函数中,if语句执行了300次,for语句执行了50次,return语句执行了50次;在prime函数中,for语句执行了200次,return语句执行了30次;在Math_sqrt函数中,if语句执行了20次,return语句执行了30次。设定预设第三阈值为100,计算机判断上述数据是否超出这一预设第三阈值。
步骤m,若所述目标语句块执行次数超出所述第三阈值,则判定超出所述第三阈值的数据对应的语句为待优化语句。
在本实施例中,终端将目标语句块执行次数中超出预设第三阈值的数据所对应的语句判定为待优化语句。具体地,沿用上述具体实施例的数据,上可判定在main函数中if语句的执行次数300超出预设第三阈值100,故判定main函数中的if语句为待优化的关键语句;在prime函数中for语句的执行次数200超出预设第三阈值100,故判定prime函数中的for语句为待优化的关键语句。
进一步地,在本实施例中,步骤S10具体包括:
步骤n,在接收到所述性能检测指令时,获取所述性能检测指令中的原始代码,并判断所述原始代码中是否存在待执行函数;
在本实施例中,用户通过导入一原始代码发起性能检测指令,终端接收到这一性能检测指令,获取这一性能检测指令中的上述原始代码,并通过函数识别字符或语句判断上述原始代码中是否存在待执行的函数。需要说明的是,大部分程序代码均存在待执行函数,只有一些小型代码片段可能仅由若干语句组成,而不存在待执行函数。
步骤o,若所述原始代码中存在所述待执行函数,则判定所述原始代码为所述待检测源码,并获取所述性能统计代码;
在本实施例中,若终端经识别判断出这一原始代码中存在待执行函数,则将这一原始代码作为待检测源码,并用本发明中的方案对这一原始代码进行性能检测。若这一原始代码中不存在待执行函数,则可说明这一原始代码为若干语句组成的小型代码片段。
步骤p,根据所述性能统计代码,确定所述目标函数与目标语句块。
在本实施例中,终端从预设性能统计代码获取第一正则表达式与第二正则表达式,并逐行将待检测源码与第一、第二正则表达式进行匹配,确定出待检测源码中的目标函数与目标语句块。
进一步地,在本实施例中,步骤S40之前还包括:
步骤q,根据预设权重、所述目标函数的函数执行次数与函数执行时间,生成每一目标函数的性能参考值,其中,所述函数执行次数与函数执行时间为所述第二性能数据;
其中,预设权重包括函数执行次数对应的第一权重与函数执行总时间对应的第二权重。第一权重与第二权重可根据具体情况灵活设定。
在本实施例中,终端将第一权重与每一函数执行次数的乘积按从大到小的顺序依次排序,获取每一目标函数的第一序号,将第一序号作为分子,并将目标函数的个数作为分母,得到每一目标函数对应的第一权重分数。终端将第二权重与每一函数执行总时间的乘积按从大到小的顺序依次排序,获取每一目标函数的第二序号,将第二序号作为分子,目标函数的个数作为分子,得到每一目标函数对应的第二权重分数。终端将第一权重分数与第二权重分数的和作为每一目标函数的性能参考值。
步骤r,按照所述性能参考值从高到低显示目标函数名称以及对应的函数执行次数与函数执行时间;
在本实施例中,终端根据判定后所生成的每一目标函数的性能优劣权重,按照从高到低的顺序显示当前所有执行函数中的待优化函数的函数名称以及对应的执行总时间、执行次数与平均执行时间。用户通过上述的显示结果,分析目标函数的性能,并确定目标函数中的待优化函数。
步骤s,按照目标语句块执行次数从大到小的顺序依次显示目标语句块名称以及对应的目标语句块执行次数,其中,所述目标语句块执行次数为所述第一性能数据。
在本实施例中,终端按照数值大小分别为每一函数所对应的目标语句块进行排序,优先显示每一函数中执行次数多的目标语句块以及每一目标语句块执行次数。用户获取到上述显示结果后,对各个目标语句块进行分析,并确定目标语句块中的待优化语句。具体地,若main函数中if语句的执行次数为300次,else语句的执行次数为250次,for语句的执行次数为200次,return语句的执行次数为400次,则终端按照return语句、main语句、if语句、else语句和for语句的顺序显示。用户可根据上述显示的数据对目标语句的性能进行分析。
进一步地,所述代码性能检测方法还包括:
步骤t,获取所述目标代码中的工具函数与所述性能统计代码中的性能统计函数,并将所述工具函数与性能统计函数作为统计工具函数;
其中,工具函数为处理统计后的数据的方法,性能统计函数为行计数函数与执行统计函数。
在本实施例中,终端分别获取目标代码中的工具函数,以及性能统计代码中的行计数函数与执行统计函数,并将上述工具函数、行计数函数与执行统计函数作为统计工具函数。
步骤u,将所述统计工具函数写入指定文件,以基于所述指定文件中的所述统计工具函数对下一待检测的代码进行性能数据统计。
在本实施例中,终端将上述统计工具函数写入名为js_profile_code.js的文件中,方便后续再次对代码中的函数与目标语句块进行性能检测时能够直接从js_profile_code.js的文件中调用上述统计工具函数。
本发明提供一种代码性能检测方法,所述代码性能检测方法进一步通过直接获取待优化函数中的目标语句块的执行次数,精确地定位到降低待优化函数性能的若干语句,使得提高了代码性能分析效率,节省了代码性能分析时间;通过判断原始代码是否为存在待执行函数的代码,使得确定本发明的一个最佳适用范围;通过优先显示性能低的函数与目标语句块,使得程序员能够更加直观地获取到耗时最久、执行次数最多的相关代码的信息,从而更加快速地定位到导致代码性能不佳的具体函数,进而定位到待优化函数中的目标语句块,进一步提高了代码性能优化效率,同时提升了用户体验;通过将统计工具函数汇总并写入特定文件,使得后续需要使用到相关函数时可以直接从特定文件中调用,提高了计算机对代码进行性能检测的工作效率。
本发明还提供一种代码性能检测装置,所述代码性能检测装置包括:
函数语句确定模块,用于在接收到性能检测指令时,获取待检测源码与预设性能统计代码,并确定所述待检测源码中的目标函数以及所述目标函数中的目标语句块;
性能代码注入模块,用于基于所述目标函数与目标语句块在所述待检测源码中的目标位置信息,将所述性能统计代码注入所述待检测源码中的目标注入位置,将已注入的待检测源码作为目标代码;
性能数据获取模块,用于执行所述目标代码,并基于所述性能统计代码中的执行统计代码与行计数统计代码,分别获取所述目标函数的第一性能数据与所述目标语句块的第二性能数据;
优化语句确定模块,用于根据所述第一性能数据与第二性能数据,确定所述目标函数中的待优化函数以及所述待优化函数中的待优化语句。
所述代码性能检测装置还包括:
正则获取匹配模块,用于从所述性能统计代码中获取与所述目标函数相关的第一正则表达式以及与所述目标语句块对应的第二正则表达式,并将所述第一正则表达式与第二正则表达式逐行匹配所述待检测源码;
第一正则匹配模块,用于在所述待检测源码中存在与所述第一正则表达式相匹配的第一部分代码时,判定所述第一部分代码为所述目标函数的执行语句,并根据所述执行语句确定所述目标函数;
第二正则匹配模块,用于在所述待检测源码中存在与所述第二正则表达式相匹配的第二部分代码时,判定所述第二部分代码为所述目标语句块。
所述性能代码注入模块具体包括:
位置信息获取单元,用于获取所述执行语句的第一位置信息以及所述目标语句块的第二位置信息,将所述第一位置信息与第二位置信息作为所述目标位置信息;
注入位置确定单元,用于基于所述目标位置信息,确定所述执行统计代码与行计数统计代码分别对应的第一注入位置与第二注入位置,将所述第一注入位置与第二注入位置作为所述目标注入位置;
性能代码注入单元,用于将所述性能统计代码注入所述目标注入位置,将已注入待检测源码作为所述目标代码。
所述代码性能检测装置还包括:
特定语句判断模块,用于判断所述目标语句块中是否存在特定语句;
代码直接注入模块,用于若所述目标语句块中存在所述特定语句,则将所述特定语句所在的位置作为所述第二注入位置,并将所述行计数统计代码注入所述第二注入位置;
代码间接注入模块,用于若所述目标语句块中不存在所述特定语句,则在所述目标语句块中添加所述特定语句,并重复执行步骤:将所述特定语句所在的位置作为所述第二注入位置,并将所述行计数统计代码注入所述第二注入位置。
所述性能数据获取模块具体包括:
函数数据判断单元,用于获取所述第一性能数据中的函数执行次数与函数执行时间,并判断所述函数执行次数与函数执行时间是否分别超出预设第一阈值与预设第二阈值;
优化函数确定单元,用于若所述函数执行次数超出所述第一阈值且所述函数执行时间超出所述第二阈值,则判定超出所述第一阈值和第二阈值的数据所对应的函数为待优化函数;
语句数据判断单元,用于获取所述第二性能数据中与所述待优化函数对应的目标语句块执行次数,并判断所述目标语句块执行次数是否超出预设第三阈值;
优化语句确定单元,用于若所述目标语句块执行次数超出所述第三阈值,则判定超出所述第三阈值的数据对应的语句为待优化语句。
所述函数语句确定模块具体包括:
原始代码判断单元,用于在接收到所述性能检测指令时,获取所述性能检测指令中的原始代码,并判断所述原始代码中是否存在待执行函数;
原始代码判定单元,用于若所述原始代码中存在所述待执行函数,则判定所述原始代码为所述待检测源码,并获取所述性能统计代码;
函数语句确定单元,用于根根据所述性能统计代码,确定所述目标函数与目标语句块。
所述代码性能检测装置还包括:
性能权重生成模块,用于根据预设权重、所述目标函数的函数执行次数与函数执行时间,生成每一目标函数的性能参考值,其中,所述函数执行次数与函数执行时间为所述第二性能数据;
函数数据显示模块,用于按照所述性能参考值从高到低显示目标函数名称以及对应的函数执行次数与函数执行时间;
语句数据显示模块,用于按照目标语句块执行次数从大到小的顺序依次显示目标语句块名称以及对应的目标语句块执行次数,其中,所述目标语句块执行次数为所述第一性能数据。
所述代码性能检测装置还包括:
工具函数获取模块,用于获取所述目标代码中的工具函数与所述性能统计代码中的性能统计函数,并将所述工具函数与性能统计函数作为统计工具函数;
工具函数写入模块,用于将所述统计工具函数写入指定文件,以基于所述指定文件中的所述统计工具函数对下一待检测的代码进行性能数据统计。
上述各程序模块所执行的方法可参照本发明代码性能检测方法各个实施例,此处不再赘述。
本发明还提供一种代码性能检测设备。
所述代码性能检测设备包括处理器、存储器及存储在所述存储器上并可在所述处理器上运行的代码性能检测程序,其中所述代码性能检测程序被所述处理器执行时,实现如上所述的代码性能检测方法的步骤。
其中,所述代码性能检测程序被执行时所实现的方法可参照本发明代码性能检测方法的各个实施例,此处不再赘述。
本发明还提供一种计算机可读存储介质。
本发明计算机可读存储介质上存储有代码性能检测程序,所述代码性能检测程序被处理器执行时实现如上所述的代码性能检测方法的步骤。
其中,所述代码性能检测程序被执行时所实现的方法可参照本发明代码性能检测方法各个实施例,此处不再赘述。
需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者系统不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者系统所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括该要素的过程、方法、物品或者系统中还存在另外的相同要素。
上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述实施例方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在如上所述的一个存储介质(如ROM/RAM、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,空调器,或者网络设备等)执行本发明各个实施例所述的方法。
以上仅为本发明的优选实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。

Claims (15)

1.一种代码性能检测方法,其特征在于,所述代码性能检测方法包括:
在接收到性能检测指令时,获取待检测源码与预设性能统计代码,并确定所述待检测源码中的目标函数以及所述目标函数中的目标语句块;
基于所述目标函数与目标语句块在所述待检测源码中的目标位置信息,将所述性能统计代码注入所述待检测源码中的目标注入位置,将已注入的待检测源码作为目标代码;
执行所述目标代码,并基于所述性能统计代码中的执行统计代码与行计数统计代码,分别获取所述目标函数的第一性能数据与所述目标语句块的第二性能数据;
根据所述第一性能数据与第二性能数据,确定所述目标函数中的待优化函数以及所述待优化函数中的待优化语句。
2.如权利要求1所述的代码性能检测方法,其特征在于,所述确定所述待检测源码中的目标函数以及所述目标函数中的目标语句块的步骤具体包括:
从所述性能统计代码中获取与所述目标函数相关的第一正则表达式以及与所述目标语句块对应的第二正则表达式,并将所述第一正则表达式与第二正则表达式逐行匹配所述待检测源码;
在所述待检测源码中存在与所述第一正则表达式相匹配的第一部分代码时,判定所述第一部分代码为所述目标函数的执行语句,并根据所述执行语句确定所述目标函数;
在所述待检测源码中存在与所述第二正则表达式相匹配的第二部分代码时,判定所述第二部分代码为所述目标语句块。
3.如权利要求2所述的代码性能检测方法,其特征在于,所述基于所述目标函数与目标语句块在所述待检测源码中的目标位置信息,将所述性能统计代码注入所述待检测源码中的目标注入位置,将已注入的待检测源码作为目标代码的步骤具体包括:
获取所述执行语句的第一位置信息以及所述目标语句块的第二位置信息,将所述第一位置信息与第二位置信息作为所述目标位置信息;
基于所述目标位置信息,确定所述执行统计代码与行计数统计代码分别对应的第一注入位置与第二注入位置,将所述第一注入位置与第二注入位置作为所述目标注入位置;
将所述性能统计代码注入所述目标注入位置,将已注入待检测源码作为所述目标代码。
4.如权利要求3所述的代码性能检测方法,其特征在于,所述获取所述执行语句的第一位置信息以及所述目标语句块的第二位置信息,将所述第一位置信息与第二位置信息作为所述目标位置信息的步骤之后,还包括:
判断所述目标语句块中是否存在特定语句;
若所述目标语句块中存在所述特定语句,则将所述特定语句所在的位置作为所述第二注入位置,并将所述行计数统计代码注入所述第二注入位置;
若所述目标语句块中不存在所述特定语句,则在所述目标语句块中添加所述特定语句,并重复执行步骤:将所述特定语句所在的位置作为所述第二注入位置,并将所述行计数统计代码注入所述第二注入位置。
5.如权利要求1所述的代码性能检测方法,其特征在于,所述根据所述第一性能数据与第二性能数据,确定所述目标函数中的待优化函数以及所述待优化函数中的待优化语句的步骤具体包括:
获取所述第一性能数据中的函数执行次数与函数执行时间,并判断所述函数执行次数与函数执行时间是否分别超出预设第一阈值与预设第二阈值;
若所述函数执行次数超出所述第一阈值且所述函数执行时间超出所述第二阈值,则判定超出所述第一阈值和第二阈值的数据所对应的函数为待优化函数;
获取所述第二性能数据中与所述待优化函数对应的目标语句块执行次数,并判断所述目标语句块执行次数是否超出预设第三阈值;
若所述目标语句块执行次数超出所述第三阈值,则判定超出所述第三阈值的数据对应的语句为待优化语句。
6.如权利要求1所述的代码性能检测方法,其特征在于,所述在接收到性能检测指令时,获取待检测源码与预设性能统计代码,并确定所述待检测源码中的目标函数以及所述目标函数中的目标语句块的步骤具体包括:
在接收到所述性能检测指令时,获取所述性能检测指令中的原始代码,并判断所述原始代码中是否存在待执行函数;
若所述原始代码中存在所述待执行函数,则判定所述原始代码为所述待检测源码,并获取所述性能统计代码;
根据所述性能统计代码,确定所述目标函数与目标语句块。
7.如权利要求1所述的代码性能检测方法,其特征在于,所述根据所述第一性能数据与第二性能数据,确定所述目标函数中的待优化函数以及所述待优化函数中的待优化语句的步骤之前,还包括:
根据预设权重、所述目标函数的函数执行次数与函数执行时间,生成每一目标函数的性能参考值,其中,所述函数执行次数与函数执行时间为所述第二性能数据;
按照所述性能参考值从高到低显示目标函数名称以及对应的函数执行次数与函数执行时间;
按照目标语句块执行次数从大到小的顺序依次显示目标语句块名称以及对应的目标语句块执行次数,其中,所述目标语句块执行次数为所述第一性能数据。
8.如权利要求1-7中任意一项所述的代码性能检测方法,其特征在于,所述代码性能检测方法还包括:
获取所述目标代码中的工具函数与所述性能统计代码中的性能统计函数,并将所述工具函数与性能统计函数作为统计工具函数;
将所述统计工具函数写入指定文件,以基于所述指定文件中的所述统计工具函数对下一待检测的代码进行性能数据统计。
9.一种代码性能检测装置,其特征在于,所述代码性能检测装置包括:
函数语句确定模块,用于在接收到性能检测指令时,获取待检测源码与预设性能统计代码,并确定所述待检测源码中的目标函数以及所述目标函数中的目标语句块;
性能代码注入模块,用于基于所述目标函数与目标语句块在所述待检测源码中的目标位置信息,将所述性能统计代码注入所述待检测源码中的目标注入位置,将已注入的待检测源码作为目标代码;
性能数据获取模块,用于执行所述目标代码,并基于所述性能统计代码中的执行统计代码与行计数统计代码,分别获取所述目标函数的第一性能数据与所述目标语句块的第二性能数据;
优化语句确定模块,用于根据所述第一性能数据与第二性能数据,确定所述目标函数中的待优化函数以及所述待优化函数中的待优化语句。
10.如权利要求9所述的代码性能检测装置,其特征在于,所述代码性能检测装置还包括:
正则获取匹配模块,用于从所述性能统计代码中获取与所述目标函数相关的第一正则表达式以及与所述目标语句块对应的第二正则表达式,并将所述第一正则表达式与第二正则表达式逐行匹配所述待检测源码;
第一正则匹配模块,用于在所述待检测源码中存在与所述第一正则表达式相匹配的第一部分代码时,判定所述第一部分代码为所述目标函数的执行语句,并根据所述执行语句确定所述目标函数;
第二正则匹配模块,用于在所述待检测源码中存在与所述第二正则表达式相匹配的第二部分代码时,判定所述第二部分代码为所述目标语句块。
11.如权利要求9所述的代码性能检测装置,其特征在于,所述性能代码注入模块具体包括:
位置信息获取单元,用于获取所述执行语句的第一位置信息以及所述目标语句块的第二位置信息,将所述第一位置信息与第二位置信息作为所述目标位置信息;
注入位置确定单元,用于基于所述目标位置信息,确定所述执行统计代码与行计数统计代码分别对应的第一注入位置与第二注入位置,将所述第一注入位置与第二注入位置作为所述目标注入位置;
性能代码注入单元,用于将所述性能统计代码注入所述目标注入位置,将已注入待检测源码作为所述目标代码。
12.如权利要求11所述的代码性能检测装置,其特征在于,所述代码性能检测装置还包括:
特定语句判断模块,用于判断所述目标语句块中是否存在特定语句;
代码直接注入模块,用于若所述目标语句块中存在所述特定语句,则将所述特定语句所在的位置作为所述第二注入位置,并将所述行计数统计代码注入所述第二注入位置;
代码间接注入模块,用于若所述目标语句块中不存在所述特定语句,则在所述目标语句块中添加所述特定语句,并重复执行步骤:将所述特定语句所在的位置作为所述第二注入位置,并将所述行计数统计代码注入所述第二注入位置。
13.如权利要求9-12任一项所述的代码性能检测装置,其特征在于,所述性能数据获取模块具体包括:
函数数据判断单元,用于获取所述第一性能数据中的函数执行次数与函数执行时间,并判断所述函数执行次数与函数执行时间是否分别超出预设第一阈值与预设第二阈值;
优化函数确定单元,用于若所述函数执行次数超出所述第一阈值且所述函数执行时间超出所述第二阈值,则判定超出所述第一阈值和第二阈值的数据所对应的函数为待优化函数;
语句数据判断单元,用于获取所述第二性能数据中与所述待优化函数对应的目标语句块执行次数,并判断所述目标语句块执行次数是否超出预设第三阈值;
优化语句确定单元,用于若所述目标语句块执行次数超出所述第三阈值,则判定超出所述第三阈值的数据对应的语句为待优化语句。
14.一种代码性能检测设备,其特征在于,所述代码性能检测设备包括:存储器、处理器及存储在所述存储器上并可在所述处理器上运行的代码性能检测程序,所述代码性能检测程序被所述处理器执行时实现如权利要求1至8中任一项所述的代码性能检测方法的步骤。
15.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有代码性能检测程序,所述代码性能检测程序被处理器执行时实现如权利要求1至8中任一项所述的代码性能检测方法的步骤。
CN201911190460.4A 2019-11-28 2019-11-28 代码性能检测方法、装置、设备及存储介质 Pending CN110990271A (zh)

Priority Applications (2)

Application Number Priority Date Filing Date Title
CN201911190460.4A CN110990271A (zh) 2019-11-28 2019-11-28 代码性能检测方法、装置、设备及存储介质
PCT/CN2020/128337 WO2021104027A1 (zh) 2019-11-28 2020-11-12 代码性能检测方法、装置、设备及存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201911190460.4A CN110990271A (zh) 2019-11-28 2019-11-28 代码性能检测方法、装置、设备及存储介质

Publications (1)

Publication Number Publication Date
CN110990271A true CN110990271A (zh) 2020-04-10

Family

ID=70087789

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201911190460.4A Pending CN110990271A (zh) 2019-11-28 2019-11-28 代码性能检测方法、装置、设备及存储介质

Country Status (2)

Country Link
CN (1) CN110990271A (zh)
WO (1) WO2021104027A1 (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2021104027A1 (zh) * 2019-11-28 2021-06-03 深圳前海微众银行股份有限公司 代码性能检测方法、装置、设备及存储介质

Family Cites Families (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106201890B (zh) * 2016-07-18 2018-05-22 腾讯科技(深圳)有限公司 一种应用的性能优化方法及服务器
CN108563555B (zh) * 2018-01-10 2020-03-31 江苏工程职业技术学院 基于四目标优化的故障更改代码预测方法
CN109885500A (zh) * 2019-02-27 2019-06-14 苏州浪潮智能科技有限公司 一种提高软件测试覆盖率的方法和系统
CN110990271A (zh) * 2019-11-28 2020-04-10 深圳前海微众银行股份有限公司 代码性能检测方法、装置、设备及存储介质

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2021104027A1 (zh) * 2019-11-28 2021-06-03 深圳前海微众银行股份有限公司 代码性能检测方法、装置、设备及存储介质

Also Published As

Publication number Publication date
WO2021104027A1 (zh) 2021-06-03

Similar Documents

Publication Publication Date Title
CN108628751B (zh) 一种无用依赖项检测方法及装置
CN110543421B (zh) 基于测试用例自动生成算法的单元测试自动执行方法
CN103559123B (zh) 基于VxWorks操作系统的函数调用栈分析方法及装置
CN111176996A (zh) 测试用例生成方法、装置、计算机设备及存储介质
CN109766261B (zh) 覆盖测试方法、装置、计算机设备和存储介质
CN110059006B (zh) 代码审计方法及装置
CN111427784B (zh) 一种数据获取方法、装置、设备及存储介质
CN112749081A (zh) 用户界面测试方法及相关装置
CN115576999B (zh) 基于云平台的任务数据处理方法、装置、设备及存储介质
CN111857681B (zh) 一种c++系统的软件定义化关键函数定位与提取方法
CN111008151B (zh) 程序扫描方法、终端设备及计算机可读存储介质
CN110990271A (zh) 代码性能检测方法、装置、设备及存储介质
CN112540925A (zh) 新特性兼容性检测系统及方法、电子设备及可读存储介质
CN109032946B (zh) 一种测试方法和装置、计算机可读存储介质
CN113688134B (zh) 基于多维数据的可视化变量管理方法、系统及设备
CN113805861B (zh) 基于机器学习的代码生成方法、代码编辑系统及存储介质
CN114064601B (zh) 存储过程转换方法、装置、设备和存储介质
CN114065197A (zh) 调用序列生成方法、装置、电子设备、存储介质及产品
CN108415836B (zh) 利用应用程序检测计算机系统性能变化的方法和系统
CN112948478A (zh) 基于链路的代码分析方法、装置、电子设备及存储介质
CN113344023A (zh) 一种代码推荐方法、装置及系统
CN111679985A (zh) 浏览器渲染性能测试方法及装置
CN111008140A (zh) 一种跨平台的ui自动化测试方法及装置
CN105701403A (zh) 安卓应用的口令处理路径识别方法及使用该方法的装置
CN113032779B (zh) 一种基于行为参数布尔表达式规则的多行为联合匹配方法和装置

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination