CN116400910A - 一种基于api替换的代码性能优化方法 - Google Patents

一种基于api替换的代码性能优化方法 Download PDF

Info

Publication number
CN116400910A
CN116400910A CN202310342202.3A CN202310342202A CN116400910A CN 116400910 A CN116400910 A CN 116400910A CN 202310342202 A CN202310342202 A CN 202310342202A CN 116400910 A CN116400910 A CN 116400910A
Authority
CN
China
Prior art keywords
api
code
performance
apis
names
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
CN202310342202.3A
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.)
Nanjing University of Aeronautics and Astronautics
Original Assignee
Nanjing University of Aeronautics and Astronautics
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 Nanjing University of Aeronautics and Astronautics filed Critical Nanjing University of Aeronautics and Astronautics
Priority to CN202310342202.3A priority Critical patent/CN116400910A/zh
Publication of CN116400910A publication Critical patent/CN116400910A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • G06F8/34Graphical or visual programming
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • G06F8/36Software reuse
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Stored Programmes (AREA)

Abstract

本申请涉及一种API替换的代码性能优化方法。该方法包括:遍历待优化的代码的抽象语法树,获取待优化的代码中表示API用法所有的函数调用节点和函数抽取节点,将所有的函数调用节点的名称和函数抽取节点的名称,与代码等价API性能对比关系数据集中的API进行匹配,确定待优化的代码中的候选可替换API,根据候选可替换API的参数的数量和AST节点类型,确定待优化的代码中可替换API,根据可替换API的功能,生成API替换推荐列表进行显示,根据用户从API替换推荐列表中选择的API名称,从预先构建的API代码模版集中获取对应的API代码模版以使用户根据API代码模版对待优化的代码进行优化。由此,帮助开发人员利用替换建议及提供的代码模板,方便快捷地实现代码优化。

Description

一种基于API替换的代码性能优化方法
技术领域
本申请涉及代码性能优化技术领域,特别是涉及一种基于API替换的代码性能优化方法。
背景技术
软件源代码优化是指在不改变代码功能和运行结果的前提下,对代码进行等价变换,生成更加高效的目标代码的过程。在目前的软件开发过程中,开发人员往往依赖于提供可重用功能的第三方库,而第三方库通过应用程序编程接口(Application ProgrammingInterface,API)进行访问。API为软件开发人员提供了与软件开发工具包、库、操作系统、框架和云服务交互的手段。由于不同的API的算法原理和实现方式各不相同,导致API及其调用的代码在拥有相同功能的前提下具有不同的运行时间(如启动时间、用户交互响应时间等)和外部资源消耗(如内存、电量等)。由于开发者个人编程背景和经验及工作负载等因素的影响,开发者在完成编程任务时可能选择了非最优的API,严重影响软件的运行效率和用户体验。由于调用非最优API导致的软件性能缺陷已经造成了严重的软件开发问题。Selakovic等人调研了16个常用JavaScript项目中的近100个性能缺陷,他们发现由于调用非最优API导致的性能缺陷占所有性能缺陷的52%,远远高于其他类型的性能缺陷,因此非最优API调用是导致软件性能缺陷的最主要原因。
API替换的主要过程包括三步:一、功能等价API性能对比关系构建,二、API性能可替换点检测,三、API替换建议生成。
在目前的API替换建议生成中,需开发者依赖个人开发经验人工对API替换执行过程做出决策,开发者可能由于对该新API的调用并不熟悉,从而发生API误用,容易产生软件缺陷,降低了工作效率。
发明内容
基于此,有必要针对上述技术问题,提供一种能够提高工作效率的基于API替换的代码性能优化方法。
一种基于API替换的代码性能优化方法,所述方法包括:
遍历待优化的代码的抽象语法树,获取所述待优化的代码中表示API用法所有的函数调用节点和函数抽取节点;
将所有的函数调用节点的名称和函数抽取节点的名称,与所述代码等价API性能对比关系数据集中的API进行匹配,确定所述待优化的代码中的候选可替换API;
根据所述候选可替换API的参数的数量和AST节点类型,确定所述待优化的代码中可替换API;
根据所述可替换API的功能,从预先构建的代码等价API性能对比关系数据集中筛选出与所述可替换API的功能等价的API,根据所述API在推荐列表中的适应度分数生成API替换推荐列表进行显示;
根据用户从所述API替换推荐列表中选择的API名称,从预先构建的API代码模版集中获取对应的API代码模版进行显示,以使用户根据所述API代码模版对所述待优化的代码进行优化。
在其中一个实施例中,所述代码等价API性能对比关系数据集的构建方式为:
采用BeautifulSoup解析API参考文档的HTML页面,提取所有的API名称、API使用方法及API方法描述;
根据所述所有的API方法描述进行处理,获得功能特征列表;
将所有的API名称、API方法描述和所述功能特征列表输入BERT分类模型,输出API名称和功能特征对,以构建功能等价API数据集;
从目标API性能问答网站中爬取API性能对比相关的连续分析语句;
从目标代码托管网站中爬取code change信息;
对所述连续分析语句和code change信息进行信息提取,获得性能对比信息和代码片段;
对所述代码片段进行处理,获得完整的API名称;
根据所述完整的API名称,将所述性能对比信息添加到功能等价API数据集中,形成初始的代码等价API性能对比关系数据集;
对所述所有的API使用方法进行处理,获得性能信息;
将所述性能信息添加到所述初始的代码等价API性能对比关系数据集中,形成代码等价API性能对比关系数据集。
在其中一个实施例中,所述根据所述所有的API方法描述进行处理,获得功能特征列表,包括:
将所有的API方法描述输入Stanford NLP工具包,获得树状结构的解析树;
提取所述解析树中的所有动词短语并形成初始候选功能特征;
将所述初始候选功能特征输入过滤器进行过滤,获得过滤后的候选功能特征;
将所述过滤后的候选功能特征中对象和动作词为同义词的候选功能特征合并成同一功能特征,获得功能特征短语;
将所述功能特征短语用树的结构表示,形成短语树;
采用gSpan算法对所述短语树进行频繁子图挖掘,获得功能特征列表。
在其中一个实施例中,所述对所述所有的API使用方法进行处理,获得性能信息,包括:
对所述所有的API使用方法进行变量参数进行属性注释,生成参数类型注释;
选择对应的随机实例化代码对所述参数类型注释进行参数实例化随机测试,获得性能信息。
在其中一个实施例中,所述对所述代码片段进行处理,获得完整的API名称,包括:
对所述代码片段使用Python ast模块进行解析,获得所述代码片段的抽象语法树;
对所述代码片段的抽象语法树执行后序遍历,获得API的简单名称;
将所述所有的API名称和所述API的简单名称采用正则表达式匹配,获得完整的API名称。
在其中一个实施例中,所述API代码模版集的构建方式为:
收集软件项目的代码源文件;
对所述代码源文件进行筛选,获得python源代码的文件;
采用Python ast模块对所述python源代码的文件进行解析,获取所述python源代码的文件中包含的每个方法体的抽象语法树;
从每个方法体的所述抽象语法树中提取出与所述代码等价API性能对比关系数据集中的API相关的语法树,获得目标API的语法树;
采用程序切片技术从所述目标API的语法树中提取出所述目标API的使用示例;
将所述目标API的使用示例抽象为数据流图;
采用gSpan算法对数据流图进行挖掘,得到API代码模版集合。
在其中一个实施例中,所述采用gSpan算法对数据流图进行挖掘,得到API代码模版集合,包括:
采用gSpan算法对数据流图进行挖掘,获得频繁子图;
对所述频繁子图使用ast.unparse方法进行反向解析,获得完整的代码模板,以得到API代码模版集合。
在其中一个实施例中,所述方法还包括:
记录用户从所述API替换推荐列表中选择的API作为反馈信息存储至反馈信息存储库中;
根据反馈信息存储库中的反馈信息,基于适应度分数的更新公式,对所述代码等价API性能对比关系数据集中的各API在推荐列表中的适应度分数进行更新。
在其中一个实施例中,所述适应度分数的更新公式为:
Figure BDA0004158366270000051
其中,Score(i)表示第i个API更新后的适应度分数;FitScore(i)表示第i个API在当前推荐列表中的适应度分数;FitScoremin是当前推荐列表中适应度分数最小的值;FitScoremax是当前推荐列表中适应度分数最大的值;μ为权重,是一个动态值,
Figure BDA0004158366270000052
取决于第i个API的位置,pos(i)表示第i个API的位置;Feedback(i)表示第i个API的反馈信息分数。
上述API替换的代码性能优化方法,通过遍历待优化的代码的抽象语法树,获取所述待优化的代码中表示API用法所有的函数调用节点和函数抽取节点,进而将所有的函数调用节点的名称和函数抽取节点的名称,与所述代码等价API性能对比关系数据集中的API进行匹配,确定所述待优化的代码中的候选可替换API,再根据所述候选可替换API的参数的数量和AST节点类型,确定所述待优化的代码中可替换API,从而根据所述可替换API的功能,从预先构建的代码等价API性能对比关系数据集中筛选出与所述可替换API的功能等价的API,根据所述API在推荐列表中的适应度分数生成API替换推荐列表进行显示,再根据用户从所述API替换推荐列表中选择的API名称,从预先构建的API代码模版集中获取对应的API代码模版进行显示,以使用户根据所述API代码模版对所述待优化的代码进行优化。由此,帮助开发人员利用替换建议及提供的代码模板,方便快捷地实现代码优化。
附图说明
图1为一个实施例中API替换的代码性能优化方法的流程示意图;
图2为一个实施例中代码等价API性能对比关系数据集构建的流程示意图;
图3为一个实施例中树状结构的解析树示意图。
具体实施方式
为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。
在一个实施例中,如图1所示,提供了一种基于API替换的代码性能优化方法,以该方法应用于终端为例进行说明,包括以下步骤:
步骤S220,遍历待优化的代码的抽象语法树,获取待优化的代码中表示API用法所有的函数调用节点和函数抽取节点。
步骤S240,将所有的函数调用节点的名称和函数抽取节点的名称,与代码等价API性能对比关系数据集中的API进行匹配,确定待优化的代码中的候选可替换API。
步骤S260,根据候选可替换API的参数的数量和AST节点类型,确定待优化的代码中可替换API。
其中,可替换API,可以是待优化的代码中可以用其他API替换的API。
步骤S280,根据可替换API的功能,从预先构建的代码等价API性能对比关系数据集中筛选出与可替换API的功能等价的API,根据API在推荐列表中的适应度分数生成API替换推荐列表进行显示。
其中,从预先构建的代码等价API性能对比关系数据集中筛选出与可替换API功能等价的API数据,根据其运行时间、内存消耗、电量消耗数据进行多目标优化。Geatpy是一个高性能实用型进化算法工具箱,提供许多已实现的进化算法中各项重要操作的库函数,并提供一个高度模块化、耦合度低的面向对象的进化算法框架,利用“定义问题类+调用算法模板”的模式来进行进化优化,可用于求解单目标优化、多目标优化、复杂约束优化、组合优化、混合编码进化优化等。因此使用Geatpy遗传算法解决多目标优化问题,将筛选出的API数据作为输入,把运行时间、内存消耗、电量消耗数据作为决策变量创建遗传算法的种群染色体矩阵,调用Geatpy内置算法模板计算每个API的适应度,适应度越大的API性能越好,从而得出API替换推荐列表。
其中,预先构建的代码等价API性能对比关系数据集,可以是利用API参考文档以及随机测试收集API之间的等价关系及运行时间、内存消耗、电量消耗等性能对比数据,构建的等价API性能对比关系数据集。
在一个实施例中,可以从API官方说明文档中收集API功能特征,从API性能问答网站和代码托管网站中收集API性能对比信息,使用随机测试补充完善API性能信息,构建出完整详细的功能等价API性能对比关系数据集。
如图2所示,在一个实施例中,代码等价API性能对比关系数据集的构建方式为:
采用BeautifulSoup解析API参考文档的HTML页面,提取所有的API名称、API使用方法及API方法描述;根据所有的API方法描述进行处理,获得功能特征列表;将所有的API名称、API方法描述和功能特征列表输入BERT分类模型,输出API名称和功能特征对,以构建功能等价API数据集;从目标API性能问答网站中爬取API性能对比相关的连续分析语句;从目标代码托管网站中爬取code change信息;对连续分析语句和code change信息进行信息提取,获得性能对比信息和代码片段;对代码片段进行处理,获得完整的API名称;根据完整的API名称,将性能对比信息添加到功能等价API数据集中,形成初始的代码等价API性能对比关系数据集;对所有的API使用方法进行处理,获得性能信息;将性能信息添加到初始的代码等价API性能对比关系数据集中,形成代码等价API性能对比关系数据集。
其中,API参考文档可以是从存储有API参考文档的数据库、或者API官方说明文档中获得。
其中,在获得功能特征列表后,将功能特征列表映射到对应的API中,将功能特征分类视为文本分类任务,分类器将一个句子(即API方法描述)作为输入,并返回对应的功能特征短语作为输出,得到成API名称和功能特征对。
其中,BERT分类模型是BERT-base模型,以实现分类器功能,使用预训练的BERT-base模型并添加一个分类层(全连接层),其中包含确定的功能特征列表,然后根据一组由“功能特征-API方法描述”对组成的训练数据对BERT-base模型进行微调。经过BERT分类,从而得到API名称和功能特征对。
其中,目标API性能问答网站可以是技术问答网站,如Stack Overflow(简称SO),API性能对比经常在问答网站上进行讨论,此类讨论通常涉及等价API之间的某种比较,因此从技术问答网站Stack Overflow回答帖子中的连续的分析语句中提取性能对比信息。搜索的分析语句是那些连续执行timeit、memit的语句,这是标准的Python分析命令,用于测量小代码片段的执行时间和内存消耗。将这些连续分析的代码片段提取出来用于接下来的性能信息映射。
其中,目标代码托管网站可以是开源代码托管网站Github,用户对于代码的修改、变更往往出于功能完善、修改、性能提升等目的。可以通过提取Github中的code change信息来获得性能数据。制定了性能相关关键词列表。关键字包括fast,slow,expensive,cheap,performance,speedup,computation,accelerate,intensive,scalable,efficient及其变体(例如efficiency,efficiently)。包含这些关键字的code change信息被认为是提升性能的候选API信息。从code change中提取性能变更前后的代码片段用于接下来的性能信息映射。
其中,要将性能信息映射到初始的代码等价API性能对比关系数据集的API中,首先使用Python ast模块将代码片段解析为抽象语法树,然后在ast.Call和ast.Subscript节点上执行后序遍历以获得API序列,获取API的简单名称,使用SO和Github标签来确定一个简单名称可能引用哪个库。然后,该算法将简单名称与该库的所有API进行匹配,以确保确实存在具有相同简单名称的API。为了进一步减少差异,在接收者对象的名称上应用正则表达式,以根据命名约定确定其类型信息。例如,df及其变体(例如df1和df_raw)是pandas.DataFrame类型的常规名称,而arr及其变体通常用于numpy.ndarray类型。在获得完整的API名称后,将从SO和Github中抽取的性能信息补充进功能等价API数据集中。
其中,技术问答网站Stack Overflow中API性能对比关系往往比较有限,提供随机测试方法对缺少的性能对比数据进行补充完善。对从API参考文档中抽取的功能等价API使用方法,使用轻量级类型推理工具pytype的变量注释功能对API使用方法中的变量参数进行属性注释。pytype是一个静态分析器,它不执行运行它的代码。它在独立文件(“pyi文件”)中生成类型注释。预置了python使用中的常见容器类型和元素类型随机化实例化代码,根据pytype生成的类型注释,选择相应的随机实例化代码。参数实例化后使用python分析命令timeit获得代码执行时间、memit获得代码内存使用情况、psutil.sensors_battery().percent获得代码电量消耗情况,并将收集到的性能信息填充到初始的代码等价API性能对比关系数据集中。至此得到了完整的代码等价API性能对比关系数据集。
应理解,构建代码等价API性能对比关系数据集,可以为开发者自动检测API性能可替换点并生成API替换执行过程中的决策建议,方便快捷地实现代码优化。
在一个实施例中,根据所有的API方法描述进行处理,获得功能特征列表,包括:
将所有的API方法描述输入Stanford NLP工具包,获得树状结构的解析树;提取解析树中的所有动词短语并形成初始候选功能特征;将初始候选功能特征输入过滤器进行过滤,获得过滤后的候选功能特征;将过滤后的候选功能特征中对象和动作词为同义词的候选功能特征合并成同一功能特征,获得功能特征短语;将功能特征短语用树的结构表示,形成短语树;采用gSpan算法对短语树进行频繁子图挖掘,获得功能特征列表。
其中,为了收集到更准确的API功能特征信息,选择API官方文档作为功能信息来源。使用BeautifulSoup来解析API参考文档的HTML页面,提取所有API名称、API使用方法及API方法描述等信息。将API方法描述输入Stanford NLP工具包,获得树状结构的解析结果,提取解析树中的所有动词短语并形成初始候选功能特征。如图3所示的树状结构的解析树,解析树标记为VP的子树就是动词短语。
来自API方法描述的所有动词短语被认为是初始候选功能特征但是往往会包含许多与库功能无关,语义信息很少的动词短语,这样的短语应该被删掉。因此初始候选功能特征需要过滤器过滤,过滤器由停用词和短语结构两部分过滤组成,停用词过滤是手工构建的停用词列表过滤,短语结构过滤是和语法树中短语结构过滤。停用词列表包括:助动词(例如be、do、have)、情态动词和代词等特殊语法成分,通常没有实际含义,不太可能出现在有意义的功能特征中。针对语法树中短语结构过滤,使用句法结构特征来过滤掉不包含任何动词作为直接子项的无效动词短语和复杂的从句。
同样的功能可以用不同的方式来表达,同时可以使用不同的单词,这使得短语在词汇上有所不同,为了聚类这些具有相似含义的动词短语,定义了特征短语的范式:
Feature=Action Object[Condition]
其中,符号“[]”表示组件是可选的。一般来说,一个功能性特征(Feature)至少由一个动作(Action)和一个实体(Object)组成,可以被条件(Condition)(通常是介词短语)修饰。如果两个短语的对象和它们的动作词是WordNet判断的同义词,就将它们合并成同一功能特征,即:使用来自nltk.corpus.wordnet的API,将归一化的功能特征短语作为输入,若其判断两个短语对象相同并且短语的功能动词相同,则将其合并为一个功能特征短语。
利用范式将候选功能特征合并成同一功能特征后,为了进行频繁子图挖掘,需要重建短语的树表示。再应用gSpan算法挖掘频繁子图作为最终的功能特征列表,即:以短语树和最低阈值(min_sup)作为输入,识别出现频率高于最低阈值min_sup的子图作为输出。gSpan会将每个子图映射到最小深度优先搜索(DFS)编码,通过深度优先搜索,按照DFS编码顺序枚举子图。最终便可得到出现频率高于最低阈值min_sup的子图,即挖掘功能特征列表。
在一个实施例中,对所有的API使用方法进行处理,获得性能信息,包括:
对所有的API使用方法进行变量参数进行属性注释,生成参数类型注释;选择对应的随机实例化代码对参数类型注释进行参数实例化随机测试,获得性能信息。
在一个实施例中,对代码片段进行处理,获得完整的API名称,包括:
对代码片段使用Python ast模块进行解析,获得代码片段的抽象语法树;对代码片段的抽象语法树执行后序遍历,获得API的简单名称;将所有的API名称和API的简单名称采用正则表达式匹配,获得完整的API名称。
步骤S300,根据用户从API替换推荐列表中选择的API名称,从预先构建的API代码模版集中获取对应的API代码模版进行显示,以使用户根据API代码模版对待优化的代码进行优化。
其中,预先构建的API代码模版集,可以是从Github下载的客户端库中提取API的使用示例,将其抽象为数据流图,通过应用gSpan算法来挖掘频繁子图作为代码模版,构建出API代码模版集。
API代码模版集是从高质量客户端代码项目中构建代码语料库,将源代码转换为数据流图进行频繁子图挖掘,再将挖掘出的频繁子图恢复为API代码模板。主要包括两个子步骤,分别为代码语料库构建和代码模板挖掘。
代码语料库构建:通过收集GitHub上的高质量客户端代码项目来获取数据。筛选GitHub上star数量大于2000的Python开源项目,综合考虑所属领域、项目数据规模、项目中API的复杂程度完成项目的选择,在这里我们根据项目的tag分析所属领域,选择fork数大于1000、代码包大小大于1000kB、最后更新时间早于2020年的项目并以git clone的命令行方式进行下载收集。
对于收集到的软件项目,根据开发语言对项目中的多个源文件进行筛选,即保留以.py结尾的源文件。通过Python ast模块对Python源代码进行解析,获取源文件中包含的每个方法体的抽象语法树,从中提取出数据集中API相关语法树,并使用程序切片技术提取出目标API对应的使用示例。
代码模板挖掘:与AST和方法调用序列相比,图模型在描述变量之间的交互方面更具表现力,使用API类型注释数据节点来扩充数据流图。数据流图中的顶点可以分为数据和操作。为了更好地适应库重用问题,用相应的API类型名称注释每个数据节点。利用Pythonast模块完成数据流图的构建。首先,使用Python ast解析源代码,从python代码生成中间表示(IR)。IR独立于源语言,旨在有利于进一步处理。其次,从IR生成控制流图,这些图被细化为静态单一分配(SSA)形式。第三,将控制流图转化为数据流图。在为语料库生成数据流图之后,我们再次应用gSpan算法来挖掘频繁子图作为代码模板。
作为模板挖掘的最后一步,将图形形式的代码模版恢复为模板代码。在数据流图的生成过程中,从语法树中记录相应的节点。要从数据流图构建模板代码,首先列出图中包含的所有树节点,然后随机选择原始源代码的语法树节点并搜索树中节点的最小公共祖先(LCA)。全部搜索完成后,恢复了一个完整的AST抽象语法树,其中包含图中的所有节点。根据语法树使用ast.unparse方法进行反向解析即可恢复完整的代码模板。
在一个实施例中,API代码模版集的构建方式为:
收集软件项目的代码源文件;对代码源文件进行筛选,获得python源代码的文件;采用Python ast模块对python源代码的文件进行解析,获取python源代码的文件中包含的每个方法体的抽象语法树;从每个方法体的抽象语法树中提取出与代码等价API性能对比关系数据集中的API相关的语法树,获得目标API的语法树;采用程序切片技术从目标API的语法树中提取出目标API的使用示例;将目标API的使用示例抽象为数据流图;采用gSpan算法对数据流图进行挖掘,得到API代码模版集合。
在一个实施例中,采用gSpan算法对数据流图进行挖掘,得到API代码模版集合,包括:
采用gSpan算法对数据流图进行挖掘,获得频繁子图;对频繁子图使用ast.unparse方法进行反向解析,获得完整的代码模板,以得到API代码模版集合。
上述API替换的代码性能优化方法,通过遍历待优化的代码的抽象语法树,获取待优化的代码中表示API用法所有的函数调用节点和函数抽取节点,进而将所有的函数调用节点的名称和函数抽取节点的名称,与代码等价API性能对比关系数据集中的API进行匹配,确定待优化的代码中的候选可替换API,再根据候选可替换API的参数的数量和AST节点类型,确定待优化的代码中可替换API,从而根据可替换API的功能,从预先构建的代码等价API性能对比关系数据集中筛选出与可替换API的功能等价的API,根据API在推荐列表中的适应度分数生成API替换推荐列表进行显示,再根据用户从API替换推荐列表中选择的API名称,从预先构建的API代码模版集中获取对应的API代码模版进行显示,以使用户根据API代码模版对待优化的代码进行优化。由此,帮助开发人员利用替换建议及提供的代码模板,方便快捷地实现代码优化。
在一个实施例中,方法还包括:
记录用户从API替换推荐列表中选择的API作为反馈信息存储至反馈信息存储库中;根据反馈信息存储库中的反馈信息,基于适应度分数的更新公式,对代码等价API性能对比关系数据集中的各API在推荐列表中的适应度分数进行更新。
应理解,检测出可替换API之后为用户提供不同性能指标的高性能API替换推荐列表,根据用户选择的API为用户提供相应的API使用模板,辅助用户完成高性能API替换操作。在用户选择后为其提供代码模板并将其的选择作为反馈信息进行记录,根据反馈信息对替换推荐列表进行重新排序。
其中,在API替换过程中,从API替换推荐列表中选择一个API通常表明该API比用户原本的API性能更高。因此,它被认为是原始API的高性能替换。在每个查找-替换会话期间,将原始API与用户选择的API一起记录下来,将这样的原始API-替换API对插入反馈信息存储库。反馈信息存储库在处理类似的API替换建议和提高未来替换推荐系统的性能方面发挥重要作用。
其中,为了有效地将用户反馈整合到API替换推荐循环中,需要根据反馈信息对高性能API替换推荐列表进行重新排序。原本的列表仅需要根据数据收集阶段收集到的性能信息进行排序即可,需要将用户反馈信息按照一定的权值和适应度进行适应度分数的更新,根据最终的适应度分数按降序对API推荐列表进行重新排序,得出新的适应度分数后对替换推荐列表按照分数进行重新排列。
在一个实施例中,适应度分数的更新公式为:
Figure BDA0004158366270000151
其中,Score(i)表示第i个API更新后的适应度分数;FitScore(i)表示第i个API在当前推荐列表中的适应度分数;FitScoremin是当前推荐列表中适应度分数最小的值;FitScoremax是当前推荐列表中适应度分数最大的值;μ为权重,是一个动态值,
Figure BDA0004158366270000152
取决于第i个API的位置,pos(i)表示第i个API的位置;Feedback(i)表示第i个API的反馈信息分数。
上述API替换的代码性能优化方法,利用记录用户从API替换推荐列表中选择的API作为反馈信息存储至反馈信息存储库中;根据反馈信息存储库中的反馈信息,基于适应度分数的更新公式,对代码等价API性能对比关系数据集中的各API在推荐列表中的适应度分数进行更新,得出新的适应度分数后对替换推荐列表按照分数进行重新排列,提升了替换推荐性能和准确度。
应该理解的是,虽然图1的流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,图1中的至少一部分步骤可以包括多个子步骤或者多个阶段,这些子步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些子步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤的子步骤或者阶段的至少一部分轮流或者交替地执行。
以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
以上所述实施例仅表达了本申请的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。因此,本申请专利的保护范围应以所附权利要求为准。

Claims (9)

1.一种基于API替换的代码性能优化方法,其特征在于,所述方法包括:
遍历待优化的代码的抽象语法树,获取所述待优化的代码中表示API用法所有的函数调用节点和函数抽取节点;
将所有的函数调用节点的名称和函数抽取节点的名称,与所述代码等价API性能对比关系数据集中的API进行匹配,确定所述待优化的代码中的候选可替换API;
根据所述候选可替换API的参数的数量和AST节点类型,确定所述待优化的代码中可替换API;
根据所述可替换API的功能,从预先构建的代码等价API性能对比关系数据集中筛选出与所述可替换API的功能等价的API,根据所述API在推荐列表中的适应度分数生成API替换推荐列表进行显示;
根据用户从所述API替换推荐列表中选择的API名称,从预先构建的API代码模版集中获取对应的API代码模版进行显示,以使用户根据所述API代码模版对所述待优化的代码进行优化。
2.根据权利要求1所述的方法,其特征在于,所述代码等价API性能对比关系数据集的构建方式为:
采用BeautifulSoup解析API参考文档的HTML页面,提取所有的API名称、API使用方法及API方法描述;
根据所述所有的API方法描述进行处理,获得功能特征列表;
将所有的API名称、API方法描述和所述功能特征列表输入BERT分类模型,输出API名称和功能特征对,以构建功能等价API数据集;
从目标API性能问答网站中爬取API性能对比相关的连续分析语句;
从目标代码托管网站中爬取code change信息;
对所述连续分析语句和code change信息进行信息提取,获得性能对比信息和代码片段;
对所述代码片段进行处理,获得完整的API名称;
根据所述完整的API名称,将所述性能对比信息添加到功能等价API数据集中,形成初始的代码等价API性能对比关系数据集;
对所述所有的API使用方法进行处理,获得性能信息;
将所述性能信息添加到所述初始的代码等价API性能对比关系数据集中,形成代码等价API性能对比关系数据集。
3.根据权利要求2所述的方法,其特征在于,所述根据所述所有的API方法描述进行处理,获得功能特征列表,包括:
将所有的API方法描述输入Stanford NLP工具包,获得树状结构的解析树;
提取所述解析树中的所有动词短语并形成初始候选功能特征;
将所述初始候选功能特征输入过滤器进行过滤,获得过滤后的候选功能特征;
将所述过滤后的候选功能特征中对象和动作词为同义词的候选功能特征合并成同一功能特征,获得功能特征短语;
将所述功能特征短语用树的结构表示,形成短语树;
采用gSpan算法对所述短语树进行频繁子图挖掘,获得功能特征列表。
4.根据权利要求2所述的方法,其特征在于,所述对所述所有的API使用方法进行处理,获得性能信息,包括:
对所述所有的API使用方法进行变量参数进行属性注释,生成参数类型注释;
选择对应的随机实例化代码对所述参数类型注释进行参数实例化随机测试,获得性能信息。
5.根据权利要求2所述的方法,其特征在于,所述对所述代码片段进行处理,获得完整的API名称,包括:
对所述代码片段使用Python ast模块进行解析,获得所述代码片段的抽象语法树;
对所述代码片段的抽象语法树执行后序遍历,获得API的简单名称;
将所述所有的API名称和所述API的简单名称采用正则表达式匹配,获得完整的API名称。
6.根据权利要求2所述的方法,其特征在于,所述API代码模版集的构建方式为:
收集软件项目的代码源文件;
对所述代码源文件进行筛选,获得python源代码的文件;
采用Python ast模块对所述python源代码的文件进行解析,获取所述python源代码的文件中包含的每个方法体的抽象语法树;
从每个方法体的所述抽象语法树中提取出与所述代码等价API性能对比关系数据集中的API相关的语法树,获得目标API的语法树;
采用程序切片技术从所述目标API的语法树中提取出所述目标API的使用示例;
将所述目标API的使用示例抽象为数据流图;
采用gSpan算法对数据流图进行挖掘,得到API代码模版集合。
7.根据权利要求6所述的方法,其特征在于,所述采用gSpan算法对数据流图进行挖掘,得到API代码模版集合,包括:
采用gSpan算法对数据流图进行挖掘,获得频繁子图;
对所述频繁子图使用ast.unparse方法进行反向解析,获得完整的代码模板,以得到API代码模版集合。
8.根据权利要求1所述的方法,其特征在于,所述方法还包括:
记录用户从所述API替换推荐列表中选择的API作为反馈信息存储至反馈信息存储库中;
根据反馈信息存储库中的反馈信息,基于适应度分数的更新公式,对所述代码等价API性能对比关系数据集中的各API在推荐列表中的适应度分数进行更新。
9.根据权利要求1所述的方法,其特征在于,所述适应度分数的更新公式为:
Figure FDA0004158366260000041
其中,Score(i)表示第i个API更新后的适应度分数;FitScore(i)表示第i个API在当前推荐列表中的适应度分数;FitScoremin是当前推荐列表中适应度分数最小的值;FitScoremax是当前推荐列表中适应度分数最大的值;μ为权重,是一个动态值,
Figure FDA0004158366260000042
取决于第i个API的位置,pos(i)表示第i个API的位置;Feedback(i)表示第i个API的反馈信息分数。/>
CN202310342202.3A 2023-03-31 2023-03-31 一种基于api替换的代码性能优化方法 Pending CN116400910A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202310342202.3A CN116400910A (zh) 2023-03-31 2023-03-31 一种基于api替换的代码性能优化方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202310342202.3A CN116400910A (zh) 2023-03-31 2023-03-31 一种基于api替换的代码性能优化方法

Publications (1)

Publication Number Publication Date
CN116400910A true CN116400910A (zh) 2023-07-07

Family

ID=87017303

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202310342202.3A Pending CN116400910A (zh) 2023-03-31 2023-03-31 一种基于api替换的代码性能优化方法

Country Status (1)

Country Link
CN (1) CN116400910A (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN117111917A (zh) * 2023-10-23 2023-11-24 福建自贸试验区厦门片区Manteia数据科技有限公司 医疗辅助系统的交互方法、装置、电子设备及存储介质

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN117111917A (zh) * 2023-10-23 2023-11-24 福建自贸试验区厦门片区Manteia数据科技有限公司 医疗辅助系统的交互方法、装置、电子设备及存储介质
CN117111917B (zh) * 2023-10-23 2024-02-27 福建自贸试验区厦门片区Manteia数据科技有限公司 医疗辅助系统的交互方法、装置、电子设备及存储介质

Similar Documents

Publication Publication Date Title
US11989519B2 (en) Applied artificial intelligence technology for using natural language processing and concept expression templates to train a natural language generation system
US20220050967A1 (en) Extracting definitions from documents utilizing definition-labeling-dependent machine learning background
CN112262390A (zh) 基于肯定和否定模式匹配示例的正则表达式生成
US10713429B2 (en) Joining web data with spreadsheet data using examples
CN110555205B (zh) 否定语义识别方法及装置、电子设备、存储介质
US10338901B2 (en) Translation of a visual representation into an executable information extraction program
EP3891599B1 (en) Code completion of method parameters with machine learning
CN112148281A (zh) 基于意图的机器编程
CN112364167A (zh) 基于深度学习的意图识别方法、系统、设备及存储介质
JP6263858B2 (ja) 知識や情報を処理する方法、装置及びコンピュータプログラム
CN110727659A (zh) 基于sql语句的决策树模型生成方法、装置、设备及介质
Keim et al. Towards consistency checking between software architecture and informal documentation
CN116400910A (zh) 一种基于api替换的代码性能优化方法
CN112732969A (zh) 图像语义分析方法、装置、存储介质及电子设备
CN111831624A (zh) 数据表创建方法、装置、计算机设备及存储介质
CN110716953A (zh) Sql语句自动生成方法、装置、设备及可读存储介质
US9189249B2 (en) Method for automatically defining icons
Padhi et al. FlashProfile: Interactive Synthesis of Syntactic Profiles.
KR102559806B1 (ko) 기계학습 기반의 지능형 법률 판례 검색 및 통합형 법률 서비스 방법 및 장치
US20230359441A1 (en) Retrieval-augmented code completion
US20240104297A1 (en) Analysis of spreadsheet table in response to user input
CN117573096B (zh) 一种融合抽象语法树结构信息的智能代码补全方法
US20240070943A1 (en) Generating image editing presets based on editing intent extracted from a digital query
JP2017102628A (ja) 知識や情報を処理する方法、このためのコンピュータプログラム及び処理装置
Wang et al. A Method for Automatic Code Comment Generation Based on Different Keyword Sequences

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