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

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

 

1.         测试目的

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

 

2.         测试背景

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

 

3.         测试环境

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

软件环境:Tribon M3 SP5AM 12.1.SP4.17

 

4.         实际进度

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

 

5.         测试数据

测试项:2

通过数:2

 

测试1

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

因此,分别用Python编写代码,GetPanelNames.py,用PML编写代码RunPythonScript.pmlobjGetHPanelNames.pmlobj,二者实现同一功能,即单纯从AM数据库中提取Block VF2215下的所有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源代码:

 

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

你可能感兴趣的:(AVEVAMarine)