Vitesse、PML程序性能对比测试报告

来源:互联网 发布:淘宝网药品 编辑:程序博客网 时间:2024/04/30 04:04

近期做了船体TribonVitesse程序迁徙到AM的测试,以组立图标注程序为例,经过简单修改,原来的程序可以在AM平台使用,但是发现速度慢了很多。于是让同事做了性能测试,对照Vitesse数据抽取部分,用AM二次开发语言PML重写。测试报告如下:

 

1.        测试目的

本次测试目的为,通过对Python以及PML程序进行性能分析,考察Tribon二次开发程序迁移到AM的可行性,验证迁移后程序的使用性能,探讨AM二次开发适合采用哪种技术路线的问题。

 

2.        测试背景

Tribon软件即将升级为AM,二次开发工作也面临很多新的考验,Tribon程序的迁移就是其中一个,PythonPML程序二者之间选择哪一个,在前期有必要对它们进行相应的测试和比较,以期对今后的工作起到一定的指导和帮助作用。

 

3.        测试环境

硬件环境: Windows XP Professional 2002SP3Windows 7旗舰版SP4

软件环境:Tribon M3 SP5AM12.1.SP4.17

 

4.        实际进度

整个测试过程的时间跨度为一周,状态为已完成。

 

5.        测试数据

测试项:2

通过数:2

 

测试1

Tribon二次开发程序加载到AM船体模块运行,发现速度变慢,而且该程序中,数据提取占很大比重。

因此,分别用Python编写代码,GetPanelNames.py,用PML编写代码RunPythonScript.pmlobjGetHPanelNames.pmlobj,二者实现同一功能,即单纯从AM数据库中提取BlockVF2215下的所有Panel名称,循环提取1000次。在AM中分别运行RunPythonScript.pmlobjGetHPanelNames.pmlobj两个程序,得到运行所用的时间。

测试数据如下:

 

image

                                      1GetPanelNames.py运行时间

 

如图1所示,Python程序运行所用时间为633

 

image

                                 2GetHPanelNames.pmlobj运行时间

 

如图2所示,PML程序运行所用时间为22

 

测试2

Tribon二次开发组立图标注程序分别在TribonAM中运行,利用Python性能剖分工具Profile得到程序运行时间的相关数据,并保存到文件ConfigNoteCreate.prof,再利用pstats查看该结果,包括程序运行的总时间及每一个函数的运行时间。

测试数据如下:

 

image

                               3Tribon运行程序的性能数据

 

如图3所示,程序在Tribon中运行的总时间为37.794秒,其中数据提取函数ExtractData的运行时间为7.927秒,线形提取函数GetLinetypes的运行时间为5.345秒。

 

image

                              4AM运行程序的性能数据

 

如图4所示,程序在AM中运行的总时间为50.806秒,其中数据提取函数ExtractData的运行时间为11.501(5.274+3.805+2.422)秒,线形提取函数GetLinetypes的运行时间为11.462秒。 

 

 

6.        测试总结

测试顺利通过,并得到以上测试数据,为了更明确地表达及比较数据,将测试2的数据制作成如下图表:

 

image

                                      图表1:程序运行时间

 

image

                                       图表2:程序运行时间百分比

 

根据图表1和图表2所示,可以清晰的看到程序迁移前后性能数据的变化,由此初步得出以下结论:

l 运行同样的程序,在TribonAM环境比较,AM中时间变长;

l AM环境下,同样的数据提取操作,使用PythonPML速度相差巨大,Python慢很多;

l 仅比较数据抽取操作耗时,AMTribon比较,时间占比增加。

经过多次测试表明,每次测试的时间会有差别,但总的来说,对于结论没有影响。

 

7.        意见建议

根据上述测试结果,Python程序迁移到AM后,性能将会降低,建议用PMLC#重写程序。

 

GetPanelNames.py源代码:

 

importSdrBlock

 

defGetPanelsNames(block):

   sb =SdrBlock.SdrBlock(block)

   names =sb.GetPanelNames()

   weights =sb.GetPanelWeights()

   return names,weights

 

deftest():

   block ="VF2215"

   for x inrange(1000):

       names, weights =GetPanelsNames(block)

 

if __name__ =='__main__':

   test()

 

RunPythonScript.pmlobj源代码如下:

 

import'marAPI'

handleany

endhandle

 

define objectRunPythonScript

endobject

 

define method.RunPythonScript()

 

   !dt = objectdatetime()

   $p Start time:$!dt

 

   using namespace'Aveva.Marine.Utility'

 

   !mpe = objectMarPythonEngine()

   !mpe.RunPythonScript('C:\AVEVA\Marine\OH12.1.SP4\Vitesse\Examples\Hull\AppendPythonPath.py')

 

   !mpe.RunPythonScript('C:\AVEVA\Marine\OH12.1.SP4\Vitesse\Examples\Hull\GetPanelNames.py')

 

   !dt2 = objectdatetime()

   $p End time:$!dt2

 

endmethod

 

GetHPanelNames.pmlobj源代码:

 

define objectGetHPanelNames

endobject

 

define method.GetHPanelNames()

 

   !dt = objectdatetime()

   $p Start time:$!dt

 

   do !X FROM 1 TO 1000 BY1

 

       VAR !MS COLLECT ALL HPANEL FOR/VF2215

       VAR !NS EVALUATE NAME FOR ALL FROM!MS

       VAR !WS EVALUATE GWEIGHT FOR ALLFROM !MS

 

   enddo

 

   !dt2 = objectdatetime()

   $p End time:$!dt2

 

endmethod

0 0