前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >系统架构师论文-论软件的性能优化设计

系统架构师论文-论软件的性能优化设计

作者头像
cwl_java
发布2019-10-26 20:52:02
1K0
发布2019-10-26 20:52:02
举报
文章被收录于专栏:cwl_Javacwl_Java

论软件的性能优化设计

[摘要]

本人2004年有幸参加了中国石油集团的高性能数控测井系统项目的开发研制工作。该系统是在当前测井成套测井装备的基础上,为了满足高精度,高性能,高效率的要求开发的测井系统。该系统由井下成套仪器,测井遥测系统,测井地面系统,测井软件系统,测井解释评价系统等子系统组成。本人在其中主要是负责测井软件系统的分析、设计以及部分开发任务。作为整个系统控制核心的测井软件如何才能保证有整个系统的高性能和高可靠性呢? 本文从系统优化、程序设计优化两个方面来详细讨论如何提高整个测井软件系统的性能。其中系统优化主要是通过调节软件运行环境来优化软件性能,程序设计优化主要从程序架构设计、语法、内存管理、输入输出等方面来讨论如何采取措施提高软件的性能。

[正文]

随着当前石油测井技术的发展,为了能更快,更好的得到储层地层信息,解决目前国内测井系统不统一,测井精度不高,效率低下的缺点,2004年1月中国石油集团公司科技局成立了高性能数控测井系统项目,目的是为国内测井行业提供一个从井下到地面以及解释评价的整套测井系统。系统的设计目标是一次测井,取得所有合格资料,并且能保证60井次的免维修率。整个系统由井下成套仪器,测井遥测系统,测井地面系统,测井软件系统,测井解释评价系统等子系统组成。我主要是负责测井软件系统的分析,设计和部分开发工作。整个测井软件系统完成三个主要任务:测井数据的采集、测井数据的工程信计算、测井过程的监控。対应于这三个任务,整个系统分为三个系统层:数据驱动层(简称前端),数据处理层(主控)和表象管理层(后端)。数据驱动层的主要目的是封装地面系统和井下遥测系统,为数据的上传和命令下达提供统一的接口。数据处理层的主要目的是按每种仪器的刻度算法计算测井原始数据。表象管理层则负责测井数据的表象处理,主要是曲线和图像的显示与绘图。系统前端运行在Vxworks系统上,主控程序和后端显示程序运行在Window2000系统中。前端主要是采用Tornado2.0开发,主控程序和后端显示程序采用VisualC++2003开发。 由于测井软件系统负责着整个井下仪器的数据采集、仪器状态控制和测井资料获取。所以対测井软件系统的性能要求是非常高的。这主要表现在以下方面:采集数据的完整性和正确性要求。由于目前井下仪器主要是通过100K的CTS遥测传输数据。要求每80毫秒采集一个完整的数据帧,由于仪器算法的特殊性,要求不能丢掉一帧,也不能采集错误的数据。这就要求数据驱动层有非常好的实时性和高可靠性。 数据显示和打印的实时性要求。由于井下地质情况复杂,为了保证测井安全以及测井数据质量,需要把测井的数据用曲线和图像的形式实时的显示和打印出来,以便于监控测井过程中井下的各种情况。在软件分析设计和开发中,我们主要是系统优化和程序设计优化两个方面采取措施来提高软件的性能并取得了比较好的效果。下面我主要从这两方面进行讨论:

一、系统优化

系统优化主要是从测井软件运行的系统环境角度方面采用措施来提高软件的性能。由于Wmdow2000操作系统的分时多任务系统,不能保证在80ms时间间隔内测井系统所要求的数据的完整性和正确性,所以我们采用VxWorks实时操作系统做为前端操作系统,运行数据采集程序,保证测井数据完整和正确。再通过网络连接到主控程序处理数据。为了保证系统网络数据传输的性能,采用千兆网,连接主控和前端。同时为了提高数据10的响应速度,以及数据的可靠,采用SCSI接口的破盘阵列,提高数据的冗余度来保证系统数据的可靠性。同时,主机系统采用Intel公司P4EE结构的多线程处理器,以及512M的DDR内存,来满足数据呑吐的要求。

二、程序设计优化

主要是程序设计优化主要从程序架构设计,语法算法和编径,内存管理,输入输出,软件测试等方面采取措施提高软件的性能。

  • 1.程序架构设计 由于优化性能并不是个局部的过程,整个程序的性能提高必须在程序设计的开始阶段就给予考虑和规划,以设计良好的软件架构保证系统的良好性能。本系统采用三层系统结构,各层之间采用网络连接,实现松散的耦合。即使后端显示程序出现错误,也可以保证测井数据的完整和正确。同时引入组件対象的开发思想,把每个仪器的算法及控制都做成组件,并进行单独的测试,从而保证组件的正确性。采用这种办法不仅可以保证错误不会在系统的扩 散,方便系统的调试。同时也可以利用以前成熟的仪器算法和控制代码,不会引入新的风险,提高系统的成熟度和可靠性。
  • 2.语法算法优化和编译优化 在代码开发阶段,可以通过C++语法特点来优化系统,实现更好的性能。例如程序中大量的简单函数,为了提高运行效率,一般都采用内联函数的方式实现。在循环语句中,対各种情况进行度量主要通过把临时变量提出到循环体外,以及设M break和continue语言减少循环次数。在対大内存対象的参数传送上,例如仪器服务表结构,基本都是利用引用和指针实现,减少系统在堆栈上的内存分配。在仪器的刻度计算中经常要用到各种各样的算法,采用在保证测井精度的原则下,根据测井原理优化算法,尽量把一些递归和非线性的算法,转换为非递归的简单运算。 同时为了充分发挥Intel CPU的功能,我们选择Intel的C++编译器,做为系统的编译器。Intel编译器対C++普误检查比较严格,这也保证了程序运行时的错误减少。在开发库的选择上,我们也采用了精练的All库开发仪器组件,使用WTL库开发用户的界面,同时使用S71库进行数据结构的实现。WIL库的使用使得我们可以抛弃传统的MFC动态库,减少程序的内存占用,也可以减少MFC常见的内存泄漏。S71是经过考验的C++标准库,实现的代码精练高效,管理方便。经过我们测试,同样的数据结构如队列、链表等,S71的实现比MFC的实现,S7L的速度大约快10%。
  • 3.内存管理的优化 内存管理対系统也很重要,在测井后端显示程序中,由于要分配大量的小対象,例如曲线和矩形等,通过分析性能测试数据,发现大量的小内存释放和分配,成为后端显示程序的速度瓶颈,所以我们采用自己的内存管理机制来减少系统的调用。首先根据测试数据度量,分配一大块内存给应用程序,然后通过管理这块内存,来满足程序対小内存块的请求和释放。如果内存不足的话,可以另外分配大块内存进行扩充。通过采用自己的内存管理机制后,再运行测试程序,发现程序的运行速度几乎提高了两倍。
  • 4.输入和输出优化 输入输出在系统的应用非常的多,特别是本系统采用三层网络的结构,其中的网络输入输出更加的重耍。为了系统取的最好的性能,我们対前端和主控之间,主控和后端显示之间的网络通讯采用的都是多线程异歩通讯的方式。与以前采用同歩的方式対比,系统的速度提高了一倍,而且网络的故障也减少了很多,基本没有发生网络通讯中断,和数据掉帧的现象。在本系统中还有一个比较关键的技术难点,就是在如何在显示测井曲线和图像时同歩连续的打印出显示的曲线。由于程序的实时性要求,程序在网络通讯和数据计算上已经消耗了大部分的资源。在这方面我们主要采取的技术手段的同歩缓存显示数据,然后在安排一个单独的线程专门负责测井曲线的打印。经过测试,打印和显示之间只有一米左右的延迟。在200:1的通常测井显示比例下,这点延迟是在允许范围内的。
  • 5.软件测试 测试并不能直接提高软件的性能,但是测试是提高软件性能的有效手段。一个好的测试工具更能提高工作的效率和质量。在本系统的开发过程中,我们主要是使用Rational公司的Purityplus I具进行测试。特别是用其中的Quantify工具进行系统性能测试,可以精确到代码行。通过它可以快速发现系统的性能瓶颈在哪儿,在哪儿耗时特别多,以及整个程序的远行时间。大部份的优化措施都是在测试过程中发现问题,然后在进行具体的优化。 在采用以上各种优化措施后,软件系统的整体运行效率提高了50%左右,今年上半年,整个系统完成了系统联调。在下井实验过程中,在连接井下仪器、地面系统、和测井软件系统的基础上,软件运行可靠,保证了 24小时不断电的情况下,数据帧掉帧率为0,代码错误率为0的好效果,得到用户的认可。 在整个系统的开发过程中,特别是対软件的性能优化,使我认识到软件开发中采用不同的设计和措施対软件的性能影响是很大的。好的测试工具対性能的提升有很大的帮助。在目前対软件性能要求越来越严格的要求下,只有在重视测试方法和测试工具使用的情况下,采用恰当的优化方法才能提高系统的性能。
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-10-14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 论软件的性能优化设计
    • [摘要]
      • [正文]
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档