近期做了船体Tribon Vitesse程序迁徙到AM的测试,以组立图标注程序为例,经过简单修改,原来的程序可以在AM平台使用,但是发现速度慢了很多。于是让同事做了性能测试,对照Vitesse数据抽取部分,用AM二次开发语言PML重写。测试报告如下:
1. 测试目的
本次测试目的为,通过对Python以及PML程序进行性能分析,考察Tribon二次开发程序迁移到AM的可行性,验证迁移后程序的使用性能,探讨AM二次开发适合采用哪种技术路线的问题。
2. 测试背景
Tribon软件即将升级为AM,二次开发工作也面临很多新的考验,Tribon程序的迁移就是其中一个,Python和 PML程序二者之间选择哪一个,在前期有必要对它们进行相应的测试和比较,以期对今后的工作起到一定的指导和帮助作用。
3. 测试环境
硬件环境: Windows XP Professional 2002 SP3,Windows 7 旗舰版SP4。
软件环境:Tribon M3 SP5,AM 12.1.SP4.17。
4. 实际进度
整个测试过程的时间跨度为一周,状态为已完成。
5. 测试数据
测试项:2
通过数:2
测试1:
将Tribon二次开发程序加载到AM船体模块运行,发现速度变慢,而且该程序中,数据提取占很大比重。
因此,分别用Python编写代码,GetPanelNames.py,用PML编写代码RunPythonScript.pmlobj和GetHPanelNames.pmlobj,二者实现同一功能,即单纯从AM数据库中提取Block VF2215下的所有Panel名称,循环提取1000次。在AM中分别运行RunPythonScript.pmlobj和GetHPanelNames.pmlobj两个程序,得到运行所用的时间。
测试数据如下:
图1:GetPanelNames.py运行时间
如图1所示,Python程序运行所用时间为6分33秒。
图2:GetHPanelNames.pmlobj运行时间
如图2所示,PML程序运行所用时间为22秒。
测试2:
将Tribon二次开发组立图标注程序分别在Tribon和AM中运行,利用Python性能剖分工具Profile得到程序运行时间的相关数据,并保存到文件ConfigNoteCreate.prof,再利用pstats查看该结果,包括程序运行的总时间及每一个函数的运行时间。
测试数据如下:
图3:Tribon运行程序的性能数据
如图3所示,程序在Tribon中运行的总时间为37.794秒,其中数据提取函数ExtractData的运行时间为7.927秒,线形提取函数GetLinetypes的运行时间为5.345秒。
图4:AM运行程序的性能数据
如图4所示,程序在AM中运行的总时间为50.806秒,其中数据提取函数ExtractData的运行时间为11.501(5.274+3.805+2.422)秒,线形提取函数GetLinetypes的运行时间为11. 462秒。
6. 测试总结
测试顺利通过,并得到以上测试数据,为了更明确地表达及比较数据,将测试2的数据制作成如下图表:
图表1:程序运行时间
图表2:程序运行时间百分比
根据图表1和图表2所示,可以清晰的看到程序迁移前后性能数据的变化,由此初步得出以下结论:
l 运行同样的程序,在Tribon和AM环境比较,AM中时间变长;
l AM环境下,同样的数据提取操作,使用Python和PML速度相差巨大,Python慢很多;
l 仅比较数据抽取操作耗时,AM与Tribon比较,时间占比增加。
经过多次测试表明,每次测试的时间会有差别,但总的来说,对于结论没有影响。
7. 意见建议
根据上述测试结果,Python程序迁移到AM后,性能将会降低,建议用PML及C#重写程序。
GetPanelNames.py源代码:
import SdrBlock
def GetPanelsNames(block):
sb = SdrBlock.SdrBlock(block)
names = sb.GetPanelNames()
weights = sb.GetPanelWeights()
return names, weights
def test():
block = "VF2215"
for x in range(1000):
names, weights = GetPanelsNames(block)
if __name__ == '__main__':
test()
RunPythonScript.pmlobj源代码如下:
import 'marAPI'
handle any
endhandle
define object RunPythonScript
endobject
define method .RunPythonScript()
!dt = object datetime()
$p Start time: $!dt
using namespace 'Aveva.Marine.Utility'
!mpe = object MarPythonEngine()
!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 = object datetime()
$p End time: $!dt2
endmethod
GetHPanelNames.pmlobj源代码:
define object GetHPanelNames
endobject
define method .GetHPanelNames()
!dt = object datetime()
$p Start time: $!dt
do !X FROM 1 TO 1000 BY 1
VAR !MS COLLECT ALL HPANEL FOR /VF2215
VAR !NS EVALUATE NAME FOR ALL FROM !MS
VAR !WS EVALUATE GWEIGHT FOR ALL FROM !MS
enddo
!dt2 = object datetime()
$p End time: $!dt2
endmethod