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

论软件的性能优化设计

[摘要]

本人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的好效果,得到用户的认可。 在整个系统的开发过程中,特别是対软件的性能优化,使我认识到软件开发中采用不同的设计和措施対软件的性能影响是很大的。好的测试工具対性能的提升有很大的帮助。在目前対软件性能要求越来越严格的要求下,只有在重视测试方法和测试工具使用的情况下,采用恰当的优化方法才能提高系统的性能。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏微信公众号:Java团长

Java:new一个对象的过程中发生了什么?

java在new一个对象的时候,会先查看对象所属的类有没有被加载到内存,如果没有的话,就会先通过类的全限定名来加载。加载并初始化类完成后,再进行对象的创建工作。

9020
来自专栏算法工程师之路

回溯法+约束编程-LeetCode37(数独扫雷问题、Tuple使用)

在Python中,大家都知道tuple这个概念,是一个只读的元素容器,容器内的元素数据类型可以不同,而在CPP中大部分的容器只能储存相同数据类型的数据,而std...

11220
来自专栏LINUX阅码场

Linux内核如何替换内核函数并调用原始函数

已经多久没有编程了?很久了吧…其实我本来就不怎么会写代码,时不时的也就是为了验证一个系统特性,写点玩具而已,工程化的代码,对于我而言,实在是吃力。

8510
来自专栏全栈前端精选

Vue 项目里戳中你痛点的问题及解决办法(下)

作者:愣锤 https://juejin.im/post/5b174de8f265da6e410e0b4e

12620
来自专栏LINUX阅码场

AddressSanitizer算法及源码解析

AddressSanitizer是Google用于检测内存各种buffer overflow(Heap buffer overflow, Stack buffe...

13820
来自专栏微卡智享

Android SurfaceVeiw划矩形截屏存放到RecyclerView中

前一篇文章《Android SurfaceView onTouchEvent进阶操作OpenCV显示》我们已经实现了在SurfaceView中划矩形显示在源图上...

12930
来自专栏墨白的Java基地

java代码查错11道题

大侠们,这有何错误? 答案: 错。abstract method必须以分号结尾,且不带花括号。

8410
来自专栏磐创AI技术团队的专栏

学习OpenCV,新手常会问我的十个问题 | 视觉入门

赶快去检查/配置环境变量,看看有没有把opencv_world+版本号d.dll所在路径到系统环境变量path中去,如果没有问题,重启VS即可

14630
来自专栏LINUX阅码场

宋宝华: 关于Linux编译优化几个必须掌握的姿势

首先我们都知道,Linux内核如果用O0编译,是无法编译过的,Linux的内核编译,要么是O2,要么是Os,这点从Linux的Makefile里面可以看出:

8520
来自专栏小海怪python学习

Django学习-第五讲:模板中静态文件的加载

一个网站中除了正常的html页面之外,还有相应的样式,以及js等其他的文件,我们把除了html网页外的文件称之为静态资源文件,下面我们介绍一下怎么在django...

7820

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励