系统程序优化

2024-08-09

系统程序优化(精选9篇)

系统程序优化 篇1

SAP是世界上最大的企业解决方案提供商和ERP产品生产商,SAP系统是SAP公司旗下的ERP产品,为越来越多的大中型企业提供全面的业务解决方案,产品中内置了最先进的管理理念和管理流程,融入了各行各业的最佳业务实践,但依然不能完全满足每个企业的个性化的管理需求,因此需要使用SAP系统的专门开发语言ABAP对系统刚进行二次开发。而这些二次开发程序的性能问题容易被忽视并且成为系统的瓶颈,严重影响用户的体验效果,并可能会成为导致SAP系统性能问题的主要因素,使整个系统深受性能困扰甚至瘫痪。所以,保证ABAP程序开发质量、提升程序运行的性能对整个系统的稳定运行至关重要,也是每一个ABAP程序开发者必须要认真考虑、深入研究的重要课题。

1 需优化程序的确定

1)利用数据库的AWR(Automatic Workload Repository)工具监控和搜集系统的运行状况,根据他生成的AWR报告,获得性能表现不好的程序清单。

2)通过作业(SAP_COLLECTOR_FOR_PERFMONITOR)搜集系统运行的统计数据,用ST03或者ST03N查看分析结果,并定位平均资源消耗和总资源消耗比较多的程序清单。

3)通过SM51实时监控运行时间超长的程序清单。

对如上清单中的程序进行综合评估,根据程序资源消耗情况、运行频率、重要性、业务特点、优化历史记录等因素,选中需优化的程序清单,并确定优先级。

2 性能分析

在程序优化之前,要先弄清楚它的功能和核心逻辑,用比较典型的业务场景(常用的查询条件、正常的数据量)对程序进行测试,测试时通过SE30 对程序的资源消耗情况进行分析。可以很容易定位性能瓶颈语句,也就是我们要重点优化的语句。

在SE30 中,首先可以比较ABAP时间、数据库时间、R/3 时间, 哪方面时间占比比较大,我们就优化哪方面。当数据量达到一定级别之后,应用程序主要的资源都是消耗在数据读取上的,所以一般数据库的时间占比是比较大的,程序优化的核心也都是对数据库访问性能的优化。如下图所示:

SE30 中提供了一个分析列表,从列表中可以获得每一个程序、子程序、语句的资源消耗情况,我们很容易就能获得资源消耗大户语句,有针对性的优化。

因为用户所能输入的查询条件的组合比较灵活和复杂,所以测试的时候,要尽可能多的选择一些典型的业务场景进行测试,不同的查询条件组合,程序的性能表现会大相径庭,而且资源消耗大户语句也不相同。有时候BUFFER CACHE也会影响我们的判断。所以,要进行反复的测试和分析,才能把性能瓶颈找出来。

3 性能分析

首先就是要把整个程序的代码检查一遍,按照规范技巧对语句进行逐条优化。比如把MOVE-CORRESPONDING语句修改成MOVE语句等。

然后就进行关键查询语句优化。优化前先做测试,记录测试条件和测试结果,以便于优化之后进行对比。

在优化过程中需要反复跟踪关键数据库查询语句的执行计划。这个可以用ST05 做。在ST05 中可以查看Trace List及关键语句的执行计划。

从TRACE LIST可以监控每一个查询语句的准备(PRE PARE,OPEN)和读取数据(FETCH)的时间,单位为微秒。

从执行计划中可以看到查询的顺序,索引的使用情况。执行计划是一个有层次关系的树状结构,每一个节点代表一个执行步骤,他的执行顺序为:最右最上最先执行,在同一层级中没有子ID的最先执行,要尽量避免对大表的全表扫描或者Inde Full Scan。

4 优化案例

1)增加选择条件查询条件提高索引表的查询性能;把语句中INNER JOIN的表TC24 从语句中剥离开来,用For all entries in单独查询,然后通过循环二叉读的方式合并数据,这种方式牺牲一定的ABAP时间,来换取数据库访问时间,综合性能提升30%左右。

2)有的表比较大,因为分组聚合函数不能用For All Entries In ,所以改成直接用For All Entries In读取数据,然后再分组。对一个表还进行了两次不同维度的分组,通过清单读取时因为可以用到唯一索引,所以性能会很快。此优化之后,性能提升一倍以上。

3)当查询时进行表关联时,驱动表所能检索出来的数据越少越好,所以把查询条件放到合适的位置,本实例中表zcrctzdh特别小,但是RESB特别大,当用LGORT作为条件查询时,优化器会把zcrctzdh作为驱动表,所以把LGORT条件加到zcrctzdh表,以达到消减驱动表读取的数据量,最终提升查询的性能。优化之后,如果只按照WERKS和LGORT查询时,性能提升明显。

4)增加索引改变查询计划。如下语句中如果用WERKS和LGORT查询时,优化器会选择最小的表zcrctzdh作为驱动表,出现全表扫描,通过在表zcrctzdi中增加一个索引(物料号),改变了它的执行计划,系统改为用表zcrctzdi作为驱动表,并使用该索引进行Index Range Scan查询,此时性能也有显著提升。

5)减少Inner join表的数目,并改变连接查询的驱动表可以提升查询性能。将LTBK从查询中拆离,并把驱动表从LTAK变成LTAP。

6)循环的次数比较多,循环读取的表格比较大时,不用Bi-nary Search就比较慢,用了Binary Search方式,性能有很大改善。

5 优化总结

程序性能优化工作就是一项精益求精的工作,是一项比较困难、有挑战性的工作,程序优化者必须有持之以恒、不断探索的精神。性能优化的宗旨就是尽最大可能提升程序的性能。因为程序性能的提升也是有局限的,所以在常规优化效果不明显的情况下就要考虑升级系统软硬件环境、优化数据库、数据归档等措施。

系统程序优化 篇2

性能问题永远是永恒的主题之一,硬件问题、软件问题、网络环境等的复杂性和多变性.导致了对系统的优化变得异常复杂,如何定位性能问题出在哪个方面,是性能优化的一大难题。

一、系统性能分析

1.1找出系统性能瓶颈

系统的性能决定任务有效性、稳定性和响应速度。Linux系统使用中常会遇到系统不稳定、响应速度慢等问题,如网页无法打开、打开速度慢等现象。有人会抱怨Linux系统不好,其实这些都是表面现象。操作系统完成一个任务是与系统自身设置、网络拓朴结构、路由设备、路由策略、接入设备、物理线路等多个方面都密切相关的,任何一个环节出现问题,都会影响整个系统的性能。

因此,当Linux应用出现问题时,应当从应用程序、操作系统、服务器硬件、网络环境等方面综合排查,定位问题出现在哪个部分,然后集中解决。

1.2提出优化方案

查找系统性能瓶颈是个复杂而耗时的过程,需要在应用程序、操作系统、服务器硬件、网络环境等方面进行查找和定位,影响性能最大的是应用程序和操作系统两个方面,而这两个方面出现的问题不易察觉,隐蔽性很强。

硬件、网络方面出现的问题,一般都能很快定位。一旦找到了系统性能问题,解决起来就非常容易。如发现系统硬件存在问题,如果是物理故障,那么更换硬件,如果是硬件性能不能满足需求,升级硬件就可以了;

如果发现是网络问题,比如带宽不够、网络不稳定,只需优化和升级网络即可; 如果是应用程序问题,修改或优化软件系统即可;

而如果是操作系统配置问题,则修改系统参数、修改系统配置。

可见,只要找到了性能瓶颈,就可以提供性能优化方案,有标准、有目的地进行系统优化。

1.3确保软硬件资源使用平衡

Linux操作系统平台由无数的开源软件支撑,常见的有Apache、Tomcat、Nginx、MySQL、Python等。开源软件的最大理念是自由、开放,Linux作为一个开源平台,最终要实现的是通过这些开源软件的支持,以最低廉的成本,达到应用性能的最优化。但是,系统的性能问题并非是孤立的,解决了一个性能瓶颈,可能会出现另一个性能瓶颈,所以说性能优化的最终目的是:在一定范围内使系统的各项资源使用趋于合理并保持一定的平衡,即系统运行良好的时候恰恰就是系统资源达到了一个平衡状态的时候。

而在操作系统中,任何一项资源的过度使用都会破坏这种平衡状态,从而导致系统响应缓慢或者负载过高。例如,CPU资源的过度使用会造成系统中出现大量的等待进程,导致应用程序响应缓慢,而进程的大量增加又会导致系统内存资源的增加,当物理内存耗尽时,系统就会使用虚拟内存,而虚拟内存的使用又会造成磁盘I/O的增加并加大CPU的开销。

因此,系统性能的优化就是在硬件、操作系统、应用软件之间找到一个平衡点。

二、分析优化涉及人员

2.1 系统管理员

在做性能优化过程中,系统管理人员承担着很重要的任务。

首先,系统管理人员要了解和掌握操作系统的当前运行状态,例如系统负载、内存状态、进程状态、CPU负荷等信息,这些信息是检测和判断系统性能的基础和依据;

其次,系统管理人员还有掌握系统的硬件信息,例如磁盘I/O、CPU型号、内存大小、网卡带宽等参数信息,然后根据这些信息综合评估系统资源的使用情况;

第三,作为一名系统管理人员,还要掌握应用程序对系统资源的使用情况,更深入的一点就是要了解应用程序的运行效率,例如是否有程序BUG、内存溢出等问题,通过对系统资源的监控,就能发现应用程序是否存在异常,如果确实是应用程序存在问题,需要把问题立刻反映给程序开发人员,进而改进或升级程序。

性能优化本身就是一个复杂和繁琐的过程,系统管理人员只有了解了系统硬件信息、网络信息、操作系统配置信息和应用程序信息才能有针对性地的展开对服务器性能优化,这就要求系统管理员有充足的理论知识、丰富的实战经验以及缜密分析问题的头脑。

2.2 系统架构设计师

系统性能优化涉及的第二类人员就是应用程序的架构设计人员。如果系统管理人员在经过综合判断后,发现影响性能的是应用程序的执行效率,那么程序架构设计人员就要及时介入,深入了解程序运行状态。

首先,系统架构设计人员要跟踪了解程序的执行效率,如果执行效率存在问题,要找出哪里出现了问题; 其次,如果真的是架构设计出现了问题,那么就要马上优化或改进系统架构,设计更好的应用系统架构。2.3 软件开发师

系统性能优化最后一个环节涉及的是程序开发人员,在系统管理员或架构设计人员找到程序或结构瓶颈后,程序开发人员要马上介入进行相应的程序修改。

修改程序要以程序的执行效率为基准,改进程序的逻辑,有针对性地进行代码优化。

例如,系统管理人员在系统中发现有条SQL语句耗费大量的系统资源,抓取这条执行的SQL语句,发现此SQL语句的执行效率太差,是开发人员编写的代码执行效率低造成的,这就需要把这个信息反馈给开发人员,开发人员在收到这个问题后,可以有针对性的进行SQL优化,进而实现程序代码的优化。

从上面这个过程可以看出,系统性能优化一般遵循的流程是:首先系统管理人员查看系统的整体状况,主要从系统硬件、网络设备、操作系统配置、应用程序架构和程序代码五个方面进行综合判断,如果发现是系统硬件、网络设备或者操作系统配置问题,系统管理员可以根据情况自主解决;如果发现是程序结构问题,就需要提交给程序架构设计人员;如果发现是程序代码执行问题,就交给开发人员进行代码优化。这样就完成了一个系统性能优化的过程。

三、影响Linux性能的各种因素

3.1 系统硬件资源

1.CPU CPU是操作系统稳定运行的根本,CPU的速度与性能在很大程度上决定了系统整体的性能,因此,大多数人认为:CPU数量越多、主频越高,服务器性能也就越好,但事实并非完全如此。目前大部分CPU在同一时间内只能运行一个线程,超线程的处理器可以在同一时间运行多个线程,因此,可以利用处理器的超线程特性提高系统性能。

在Linux系统下,只有运行SMP内核才能支持超线程,但是,安装的CPU数量越多,从超线程获得的性能方面的提高就越少。另外,Linux内核会把多核的处理器当作多个单独的CPU来识别,例如两个4核的CPU,在Linux系统下会被当作8个单核CPU。但是从性能角度来讲,两个4核的CPU和8个单核的CPU并不完全等价,根据权威部门得出的测试结论,前者的整体性能要比后者低25%~30%。可能出现CPU瓶颈的应用有邮件服务器、动态Web服务器等,对于这类应用,要把CPU的配置和性能放在主要位置。

其中:

%user:表示cpu处在用户模式下的时间百分比。%sys:表示cpu处在系统模式下的时间百分比。%iowait:表示cpu等待输入输出完成时间的百分比。

swap in:即si,表示虚拟内存的页导入,即从swap disk交换到RAM。swap out:即so,表示不腻内存的页导出,即从RAM交换到swap disk。2.内存

内存的大小也是影响Linux性能的一个重要的因素,内存太小,系统进程将被阻塞,应用也将变得缓慢,甚至失去响应;内存太大,导致资源浪费。

Linux系统采用了物理内存和虚拟内存两种方式,虚拟内存虽然可以缓解物理内存的不足,但是占用过多的虚拟内存,应用程序的性能将明显下降,要保证应用程序的高性能运行,物理内存一定要足够大;但是过大的物理内存,会造成内存资源浪费,例如,在一个32位处理器的Linux操作系统上,超过8GB的物理内存都将被浪费。因此,要使用更大的内存,建议安装64位的操作系统,同时开启Linux的大内存内核支持。由于处理器寻址范围的限制,在32位Linux操作系统上,应用程序单个进程最大只能使用2GB的内存,这样以来,即使系统有更大的内存,应用程序也无法“享”用,解决的办法就是使用64位处理器,安装64位操作系统。在64位操作系统下,可以满足所有应用程序对内存的使用需求,几乎没有限制。可能出现内存性能瓶颈的应用有打印服务器、数据库服务器、静态Web服务器等,对于这类应用要把内存大小放在主要位置。

free指令是监控Linux内存使用状况最常用的指令。free–m

一般有这样一个经验公式:

应用程序可用内存 / 系统物理内存 > 70% 时,表示系统内存资源非常充足,不影响系统性能。应用程序可用内存 / 系统物理内存 < 20%时,表示系统内存资源紧缺,需要增加系统内存。

20% < 应用程序可用内存 / 系统物理内存 < 70%时,表示系统内存资源基本能满足应用需求,暂不影响系统性能。

另外,vmstat命令也能胜任监控Linux内存的使用状况的重任。3.磁盘I/O性能

磁盘的I/O性能直接影响应用程序的性能,在一个有频繁读写的应用中,如果磁盘I/O性能得不到满足,就会导致应用停滞。好在现今的磁盘都采用了很多方法来提高I/O性能,比如常见的磁盘RAID技术。

RAID的英文全称为:RedundantArrayofIndependentDisk,即独立磁盘冗余阵列,简称磁盘阵列。RAID通过将多块独立的磁盘(物理硬盘)按不同方式组合起来形成一个磁盘组(逻辑硬盘),从而提供比单个硬盘更高的I/O性能和数据冗余。通过RAID技术组成的磁盘组,就相当于一个大硬盘,用户可以对它进行分区格式化、建立文件系统等操作,跟单个物理硬盘一模一样,唯一不同的是RAID磁盘组的I/O性能比单个硬盘要高很多,同时在数据的安全性也有很大提升。

根据磁盘组合方式的不同,RAID可以分为RAID0,RAID1、RAID2、RAID3、RAID4、RAID5、RAID6、RAID7、RAID0+

1、RAID10等级别,常用的RAID级别有RAID0、RAID1、RAID5、RAID0+1几种。

RAID0:通过把多块硬盘粘合成一个容量更大的硬盘组,提高了磁盘的性能和吞吐量。这种方式成本低,要求至少两个磁盘,但是没有容错和数据修复功能,因而只能用在对数据安全性要求不高的环境中。

RAID1:也就是磁盘镜像,通过把一个磁盘的数据镜像到另一个磁盘上,最大限度地保证磁盘数据的可靠性和可修复性,具有很高的数据冗余能力,但磁盘利用率只有50%,因而,成本最高,多用在保存重要数据的场合。

RAID5:采用了磁盘分段加奇偶校验技术,从而提高了系统可靠性,RAID5读出效率很高,写入效率一般,至少需要3块盘。允许一块磁盘故障,而不影响数据的可用性。

RAID0+1:把RAID0和RAID1技术结合起来就成了RAID0+1,至少需要4个硬盘。此种方式的数据除分布在多个盘上外,每个盘都有其镜像盘,提供全冗余能力,同时允许一个磁盘故障,而不影响数据可用性,并具有快速读/写能力。通过了解各个RAID级别的性能,可以根据应用的不同特性,选择适合自身的RAID级别,从而保证应用程序在磁盘方面达到最优性能。

4.网络宽带

Linux系统在网络性能方面的优势则显而易见,Linux下的各种应用,一般都是基于网络的。因此网络带宽也是影响性能的一个重要因素,低速的、不稳定的网络将导致网络应用程序的访问阻塞,而稳定、高速的网络带宽,可以保证应用程序在网络上畅通无阻地运行。幸运的是,现在的网络一般都是千兆带宽或光纤网络,带宽问题对应用程序性能造成的影响也在逐步降低。3.2 操作系统相关资源

基于操作系统的性能优化也是多方面的,可以从系统安装、系统内核参数、网络参数、文件系统等几个方面进行衡量,下面依次进行简单介绍。

1.系统安装优化

系统优化可以从安装操作系统开始,当安装Linux系统时,磁盘的划分,SWAP内存的分配都直接影响以后系统的运行性能,例如,磁盘分配可以遵循应用的需求:对于对写操作频繁而对数据安全性要求不高的应用,可以把磁盘做成RAID0;而对于对数据安全性较高,对读写没有特别要求的应用,可以把磁盘做成RAID1;对于对读操作要求较高,而对写操作无特殊要求,并要保证数据安全性的应用,可以选择RAID5;对于对读写要求都很高,并且对数据安全性要求也很高的应用,可以选择RAID01。这样通过不同的应用需求设置不同的RAID级别,在磁盘底层对系统进行优化操作。

随着内存价格的降低和内存容量的日益增大,对虚拟内存SWAP的设定,现在已经没有了所谓虚拟内存是物理内存两倍的要求,但是SWAP的设定还是不能忽略,根据经验,如果内存较小(物理内存小于4GB),一般设置SWAP交换分区大小为内存的2倍;如果物理内存大于4GB小于16GB,可以设置SWAP大小等于或略小于物理内存即可;如果内存大小在16GB以上,原则上可以设置SWAP为0,但并不建议这么做,因为设置一定大小的SWAP还是有一定作用的。

2.内核参数优化

系统安装完成后,优化工作并没有结束,接下来还可以对系统内核参数进行优化,不过内核参数的优化要和系统中部署的应用结合起来整体考虑。例如,如果系统部署的是Oracle数据库应用,那么就需要对系统共享内存段(kernel.shmmax、kernel.shmmni、kernel.shmall)、系统信号量(kernel.sem)、文件句柄(fs.file-max)等参数进行优化设置;如果部署的是Web应用,那么就需要根据Web应用特性进行网络参数的优化,例如修改net.ipv4.ip_local_port_range、net.ipv4.tcp_tw_reuse、net.core.somaxconn等网络内核参数。

3.文件系统优化

文件系统的优化也是系统资源优化的一个重点,在Linux下可选的文件系统有ext2、ext3、xfs、ReiserFS,根据不同的应用,选择不同的文件系统。

Linux标准文件系统是从VFS开始的,然后是ext,接着就是ext2,应该说,ext2是Linux上标准的文件系统,ext3是在ext2基础上增加日志形成的,从VFS到ext3,其设计思想没有太大变化,都是早期UNIX家族基于超级块和inode的设计理念。

XFS文件系统是SGI开发的一个高级日志文件系统,后来移植到了Linux系统下,XFS通过分布处理磁盘请求、定位数据、保持Cache的一致性来提供对文件系统数据的低延迟、高带宽的访问,因此,XFS极具伸缩性,非常健壮,具有优秀的日志记录功能、可扩展性强、快速写入性能等优点。ReiserFS是在HansReiser领导下开发出来的一款高性能的日志文件系统,它通过完全平衡树结构来管理数据,包括文件数据,文件名及日志支持等,与ext2/ext3相比,最大的优点是访问性能和安全性大幅提升。ReiserFS具有高效、合理利用磁盘空间,先进的日志管理机制,特有的搜寻方式,海量磁盘存储等优点。3.3 性能分析、调优工具

下面列举一部分常用的性能分析及调优工具。1.Linux性能分析工具

CPU性能分析工具: vmstat ps sar time

strace pstree top Memory性能分析工具: vmstat strace top ipcs ipcrm cat /proc/meminfo cat /proc/slabinfo cat /proc//maps I/O性能分析工具: vmstat iostat repquota quotacheck Network性能分析工具: ifconfig ethereal tethereal iptraf iwconfig nfsstat mrtg ntop netstat cat /proc/sys/net

2.Linux 性能调优工具

通过上述工具及命令,当我们发现了应用的性能瓶颈以后,可以通过以下工具或者命令来进行性能的调整。CPU性能调优工具: nice / renic sysctl Memory性能调优工具: swapon ulimit sysctl I/O性能调优工具: edquota quoton sysctl boot line: elevator Network性能调优工具: ifconfig iwconfig sysctl 3.5 高并发性能优化

1.最小化系统调用负载

通过socket来读写数据时,都必须会用到read和write系统调用,它跨越了kernel与user空间的边界。另外,在进入kernel之前,会通过C库来进入kernel的通用函数system_call(),从这个函数中会进入文件系统层,kernel在文件系统层中确定正在处理的是哪种设备,最好进入socket层,进行数据读取和输出操作。

我们无法避免这些system call,因此要力图最小化使用这些call的次数。所以,在将数据写入一个socket的时候,尽量一次写入所有的数据,不要执行多次写数据的操作; 对于读操作来说,最好传入可支持的最大缓冲区,因为如果没有足够的数据,kernel也会试图填充整个缓冲区。2.修改用户进程可打开文件数限制

使用ulimit命令查看系统允许当前用户进程打开的文件数限制。ulimit –n。当前用户的每个进程最多允许同时打开1024个文件。这1024个文件中还得除去每个进程必然打开的标准输入,标准输出,标准错误,服务器监听 socket,进程间通讯的unix域socket等文件,那么剩下的可用于客户端socket连接的文件数就只有大约1000个左右。

使用cat /proc/sys/fs/file-max查看Linux系统级的最大打开文件数限制。通过修改配置文件的方式修改该上限值。sudo vi /etc/security/limits.conf。

在文件尾部写入以下配置,soft软限制,hard硬限制。如下图所示。* soft nofile 65536 * hard nofile 100000

3.修改网络内核对TCP连接的有关限制

在Linux上编写支持高并发TCP连接的客户端通讯处理程序时,有时会发现尽管已经解除了系统对用户同时打开文件数的限制,但仍会出现并发TCP连接数增加到一定数量时,再也无法成功建立新的TCP连接的现象。

原因在于Linux内核的TCP/IP协议实现模块对系统中所有的客户端TCP连接对应的本地端口号的范围进行了限制(例如,内核限制本地端口号的范围为1024~32768之间)。当系统中某一时刻同时存在太多的TCP客户端连接时,由于每个TCP客户端连接都要占用一个唯一的本地端口号(此端口号在系统的本地端口号范围限制中),如果现有的TCP客户端连接已将所有的本地端口号占满,则此时就无法为新的TCP客户端连接分配一个本地端口号了,因此系统会在这种情况下在connect()调用中返回失败,并将错误提示消息设为“Can’t assignrequested address”。因此需要修改此本地端口范围限制。

第一步,修改/etc/sysctl.conf文件,在文件中添加如下行: net.ipv4.ip_local_port_range = 1024 65000 这表明将系统对本地端口范围限制设置为1024~65000之间。请注意,本地端口范围的最小值必须大于或等于1024;而端口范围的最大值则应小于或等于65535。修改完后保存此文件。

第二步,执行sysctl命令:sysctl –p。如果系统没有错误提示,就表明新的本地端口范围设置成功。另外一种无法建立TCP连接的原因可能是因为Linux网络内核的IP_TABLE防火墙对最大跟踪的TCP连接数有限制。此时程序会表现为在 connect()调用中阻塞,如同死机,如果用tcpdump工具监视网络,也会发现根本没有TCP连接时客户端发SYN包的网络流量。

此时就必须修改内核对最大跟踪的TCP连接数的限制,方法同修改内核对本地端口号范围的限制是类似的: 第一步,修改/etc/sysctl.conf文件,在文件中添加如下行: net.ipv4.ip_conntrack_max = 10240 这表明将系统对最大跟踪的TCP连接数限制设置为10240。请注意,此限制值要尽量小,以节省对内核内存的占用。

第二步,执行sysctl命令:sysctl–p。如果系统没有错误提示,就表明系统对新的最大跟踪的TCP连接数限制修改成功。如果按上述参数进行设置,则理论上单独一个进程最多可以同时建立10000多个TCP客户端连接。4.调节TCP窗口

影响TCP性能的两个最重要的因素是连接带宽和往返时间或者RTT。

Sockets API 提供了几个 socket 选项,其中两个可以用于修改 socket 的发送和接收缓冲区的大小。尽管 socket 缓冲区的大小确定了通告 TCP 窗口的大小,但是 TCP 还在通告窗口内维护了一个拥塞窗口。因此,由于这个拥塞窗口的存在,给定的 socket 可能永远都不会利用最大的通告窗口。

5.使用支持高并发网络I/O的编程技术

可用的I/O技术有同步I/O,非阻塞式同步I/O(也称反应式I/O),以及异步I/O。在高TCP并发的情形下,如果使用同步I/O,这会严重阻塞程序的运转,除非为每个TCP连接的I/O创建一个线程。但是,过多的线程又会因系统对线程的调度造成巨大开销。因此,在高TCP并发的情形下使用同步 I/O是不可取的,这时可以考虑使用非阻塞式同步I/O或异步I/O。非阻塞式同步I/O的技术包括使用select(),poll(),epoll()等机制。

系统程序优化 篇3

1 服务器端操作系统的优化配置

1) 服务器端操作系统配置是提升系统速度的前提。

为了提高Access数据库程序的速度, 程序运行所依赖的操作系统配置是决定速度效率的决定性因素。影响系统运行速度的主要在于操作系统配置要与应用系统相匹配。对Access数据库应用程序而言, 影响其性能的主要因素就是服务器端磁盘访问了。在执行程序过程中, 系统对物理磁盘的访问总是一个速度的瓶颈, 当然, 这是与访问存储在内存中的数据相比较而言。所以, 我们应该尽量减少对磁盘的访问频率。因为, 任何计算机应用程序总是要向一些磁盘存储器或其它外部存储设备调用数据信息, 因为这些存储器是应用系统的数据源, 所以, 我们的目标应该是保证所有的磁盘访问都尽可能有效。要实现这一点, 最便捷有效的方法是经常整理磁盘的数据碎片, 整理Access数据库所在的磁盘驱动器以及所有的数据源驱动器, 通过磁盘整理, 保持数据存储环境最大可能地优化, 从而保证磁盘访问高效快捷, 最大程度地减少在对物理磁盘进行读写而花费的时间, 虽然这些读写是不可避免的, 但优化的存储环境可以有效提高整个体系的性能和效率。

2) 调整缓冲区空间, 使内存最大化, 减少磁盘调用频率。

首先要增加操作系统的最大缓冲区的容量, 缓冲区的空间的大小, 涉及到系统最大缓冲区空间的设置。最大缓冲区的空间指的是Access信息管理系统作为内部存储空间而保留的内存空间。存储空间越大, 用户需求的数据能在内存中找到可能性越大, 同时减少了对物理磁盘的访问频率。Access信息管理系统需要的最小缓冲区是512KB, 如果计算机的硬件配置了大容量的内存, 完全可以为Access多分配一些供其使用的内存空间, 要调整内存配置, 只需要在windows目录下的Msaccess.Ini文件中增加对最大缓冲区的设置, 例如:使用文本编辑器中的记事本, 在Msaccess.Ini文件中找到[Option]字段, 在MaxBufferSize的等号后面添加一组数值, 就可以有效增加系统的缓冲区空间, 在这里, 这组数值就是为Access应用程序运行而重新分配的缓冲区空间数值。例如:设置MaxBufferSize=4048, 将为Access应用系统分配尽可能大的缓冲区空间。手动调节这个设置, 同时要让计算机硬件都能提供以下条件:a、不能妨碍用户同时正在运行的程序, b、不会影响其自身底层操作系统的运行效率。这样的内存空间的调整, 对Msaccess.Ini文件的修改将只能在下一次Access信息管理系统重新启动时生效, 而对当前运行的windows系统程序没有任何影响。

3) 限制系统自动加载Wizards, 提高内存利用率。

在默认状态下安装MicrosoftOffice时, 安装程序将自动安装多种Office向导和模板, 这些向导和模板在计算机开机后自动加载运行, 往往占用很多的内存空间, 对Access信息管理系统用户来说没有多大用处, 但却导致系统运行速度下降。为了释放更多内存空间供Access信息管理系统运行, 如果不经常调用向导和模板, 就没有必要加载Wizards。限制加载Wizards的路径是:打开MsAccess.Ini文件, 找到[libraries]字段, 在“wizards.mdb=ro”这一句之前加一个分号, 这样就避免了Wizards的自动加载。可以释放315B的内存给Access应用程序, 有效提高Access应用程序的性能, 同时可以使每个Office应用程序减少10秒启动时间。

2 Access后台数据库的程序优化

1) Access数据库的压缩修复。

应用系统管理员要经常性地压缩Access程序代码。Access后台数据库在使用过程中, 需要不断地增加和删除记录, 但是, Access不能自动释放被删除或更新的数据空间, 即使用户删除了一个记录, 而这个纪录仍然在数据库中占据着空间。压缩数据库就是将Access的这些冗余空间回收, 从而压缩数据库, 使其冗余降低。具体的验证结果是, 可以把数据查询的平均时间减少30%~50%, 从而实现对频繁调用和添加删除数据记录的数据库程序的压缩。为了压缩和修复Access数据库, 用户必须对该Access数据库具有“打开/运行”和“以独占方式打开”的权限。因此, 基于网络的Access后台数据库的压缩和修复时间最好选择在线用户最少的时段进行。具体的操作过程是打开Access数据库的“工具”菜单, 指向“数据库实用工具”, 然后单击“压缩和修复数据库”按钮, 系统即可自动完成压缩和修复。

2) 转换宏程序, 提高代码重用率。

在Access数据库系统开发过程中, 大多采用宏命令操作来搭建一个个应用程序模型, 拖拉式操作过程大大提高了系统开发效率。但在编程工作完成以后, 对宏集程序的优化是不可忽略的环节。一定要把所有的宏重新转换成VBA代码。这主要是因为Access代码要比宏运行得快。需要注意的是, 有三个宏操作不能转换成代码, 这三个宏是Autokeys、Autoexec和Addmenu, 在Access中没有相应的等价类, 因此可以采用调用BasicAutoexec函数的方法来优化这三个宏。创建共用代码模块是优化程序的最有效策略, Access后期优化中, 要将具有公用属性的VBA代码剔选出来, 存储为一个或一组共用模块, 在需要重复使用的“事件过程”中直接调用模块, 可以大大降低代码重复写入, 缩小数据库自身容量, 使程序最小化, 速率最大化。

3) 优化数据类型声明。

在代码中声明数据类型, 应力求简洁精确。例如对一个变量的类型声明, 如果不做自定义声明, Access缺省为可变类型, 虽然看似灵活自由, 但却浪费了内存资源。最为常用的类型声明中, checkBalance这个变量不需要超过4位小数精度, 只需将其定义为确定类型而不是可变类型。对过程函数的定义同样也可以如此操作。例如, 把函数PostCredit () 声明为整形, 而不是FunctionPostCredit () 。类型声明中需要注意的是, 如果估计一个变量将会被处理成一个空值, 那么要将其定义成为可变类型而不是精确的数据类型, 否则会出现验证错误。

4) 使用From/Report变量。

在Access程序开发中, 查询功能的实现是保证用户需求得到满足的重要条件, 多种条件下的查询功能, 也是评判一个Access数据库管理系统整体性能的技术指标。例如:如果要在代码中查阅一个名为[Net Price]的文本框, 可以使用Mytemprariable=Forms![CustomerInvoice][Netprice]!语句, 这条语句的执行过程是, Access首先在Forms对象里搜索名为[CustomerInvoice]的表, 一旦找到这张表, 接下来寻找名为[NetPrice]的控制程序, 并进行相应的操作。从这个例子可以看出, Access经过两次查询最终确定指定的控制程序。如果在同一程序 (函数或者子函数) 中再次查询[CustomerInvoice]表中任一控制, 完全可以删除会在下次出现的多余语句, 只需使用DimFasformSetF=Forms![CustomerInvoice]语句。以此避免Access每次查找[CustomerInvoice]表中的对象时, 都要把数据库的Form对象中全部搜索一遍。为了简化系统执行过程[NetPrice], 我们只需使用最简化的Mytempvariable=F![NetPrice]语句, 即可实现一个查询。

5) 调用windows函数代替VBA代码。

在Access各种控件属性中, 只要操作指令相关, 总是可以用一个windows函数调用来代替VBA代码执行同一个操作。函数调用和VBA代码之间最大的区别在于, 可以节省开发时间, 因为windows函数调用是已经完成编码并经过优化, 同时也因为它们是用C语言编写的机器直接执行语言, 而VBA代码则要通过编译才能被执行, 并且需要在执行时一行一行地解释。例如, 一个最普通的例子是custom.ini设置。常用办法是使用函数得到一个文件指针, 打开文件, 读/写文件, 然后关闭它。实际上, 完全可以简单地使用GetPrivateProfileString和WritePrivateProfileString函数来实现这个操作过程, 其运行快捷并且已经编码优化, 既然随手可用的函数可以大大简化系统的操作, 就没有必要墨守成规地一步一行地进行繁琐重复的程序执行过程。

总之, 基于网络环境下的Access数据库系统, 随着系统使用周期的不断延长, 对系统的日常管理维护, 是保证系统稳定、高效运行的不容忽视的工作。随着Access版本的升级, 其原有的许多技术性缺陷必将得到不断地完善, 为了保证在线用户的需求, 应用系统也要不断升级, 始终保持技术平台的前沿性和系统运行的高效率, 需要系统管理人员不断地探索和追求。

摘要:Access因其功能完善, 结构集成, 界面友好等优势被许多网站或自动化办公系统用作后台数据库。但其作为网络信息管理系统数据库时, 存在着资源占用率高, 信息冗余量大, 运行速度低等缺陷, 如何克服这些缺陷, 是系统日常管理和维护中不容忽视的技术环节。

关键词:Access数据库,系统配置,程序优化

参考文献

[1]周国民.数据库项目开发实践.北京:中国铁道出版社[M].2005:127-130.

[2]章立民.Access2003高手攻略.北京:中国铁道出版社[M].2004:24-29.

[3]萨师煊, 王珊.数据库系统概论.北京:高等教育出版社[M].1999:96-98.

Flex应用程序的性能优化 篇4

1.尽可能减少程序的不必要运算。如下两种表达式:

var a:unit = b+(1024-200)/2;

var a:unit = b+412;

很明显下面的那个表达式运算更快。

2.尽可能地采用乘法运算来代替除法运算。如下两个表达式:

result = num / 4;

reuslt = num * 0.25;

经过统计工具计算,乘法比除法能节约150ms的时间。

3.尽可能使用强类型。比如:

var pt:Object = {x:x,y:y};

var pt:Point = new Point(x,y);

4.使用隐式类型转换。比如,

var pt:Point = points[i] as Point;

var pt:Point = points[i];

第二个的表达式使用的隐式类型转换,这样能节省开销,

5.强制转换有时要比用as转换好用。如:

pt = points[(i*2) as unit];

pt = points[uint(i*2)];

6.设置条件表达式的优先级。如:

if(expensiveTest && usuallyFalse)

if(usuallyFalse && expensiveTest())

在与运算时,应将在多数情况下为false的表达式放在前面(如第二个表达式的写法)。

7.for循环语句中的循环条件值应为一个固定值。如:

for (var i=0; ifor (var i=0; i

应采用第二种写法,将arr的length属性值存放到一个变量中去。

8.回调事件要比单独派发的事件要快,更比冒泡的事件快。

9.尽量减少使用try...catch来抛出异常信息。如:

try {isNull.x = 3;} catch(e:*) {}

if(isNull) {isNull.x = 3;}

多采用第二种方法,来减少异常。

程序控制优化 篇5

目前存在PLC控制程序中的问题,在于连锁程序的过保护和欠保护。针对设备各种情况的连锁程序,由于编写人员的能力经验等方面造成不同程度的差异,在日后的生产过程中不断暴露出来,需要随时修改,更有甚者还得经过讨论和长期观察才能确定是否修改和修改方案。

先来谈一下欠保护,这是大家普遍能够注意到的问题。当然,PLC的控制程序的优点之一就是能够在不同的情况下有效的出发各种保护信号,最大程度的保护设备。这就是连锁程序存在的必要性。通过连锁程序,方便的对各种不同的数据情况分类,对于不同于常态的情况,发出停机,停泵,启泵,开阀,关阀等等之类的命令。如下就是一段汽轮鼓风机的连锁程序,在程序中,触发任意条件,则会发出STOP命令,即停机命令。(图1)

这段程序是汽轮机和鼓风机的振动值的连锁停机程序,如果没有这段程序,在机组振动大时未发出停机命令,则会引发很大的设备事故,造成很大的损失。所以,该有的保护连锁程序,必须有,否则则会出现欠保护的情况,这对设备(特别是大型旋转设备)是致命的问题。

谈过了欠保护,再来说一下过保护。其实,相对于欠保护,过保护却很少有人注意和重视。可是在实际生产过程中,过保护出现的频率却远远大于欠保护,过保护的问题应该得到更多的关注和重视。本文的重点,就是在于提倡对于过保护问题的程序优化。

过保护从何而来,同样是从连锁程序中来,可是什么样的情况采取什么样的保护连锁程序,需要根据不用的实际生产工艺来看,不能简单的认为同一种设备,就可以采取一样的保护连锁程序,也不能简单的把所有不利于设备的情况全部一一用来参与连锁保护程序。因为,我们如果想要很好的起到设备的保护作用,有两点需要注意:

1,采集到的数据是否准确,如何保证准确,如果不准确怎么办。

2,参与保护连锁的数据是否有直接影响设备的安全运行。

PLC控制程序的优点,在于可以根据采集到的数据不断的判断现在的生产工况,根据不同的工况发出不同的命令,而不同的命令对设备起到不同的作用。所以,信号采集是PLC控制程序的起点,如果这些起点出现问题,即采集到的数据不是正确的数据,会发生什么样的情况?根据错误的采集数据,判断出现在错误的工况,根据错误的工况发出错误的命令,而错误的命令对设备产生错误的作用。由此可见,当采集数据发生错误,故障等原因时,连锁保护程序反而会对设备产生错误的影响。现在的设备,特别是大型设备,由于造价高,安全系数高,设备故障率很低;反观对其检测的测量元件,故障率要高出不少。举例说明以下,一台汽轮鼓风机机组,除了自身的故障率低以外,有操作人员对其监护维护,而检测机组的热电阻(轴瓦温度等),由于长期在高温,机组内部密闭,外部接线密集的环境下,出现故障的几率要比机组出现故障的几率要大,这时候如果保护连锁程序采取对任意温度出现异常都要出发停机信号的话,这就属于过保护了。因为,当热电阻出现故障时,虽然采集到的温度出现异常,但是机组实际运行的温度却是正常的,在机组正常生产时候突然产生停机,这样的情况是完全不必要的,特别是考虑到突然停机对整个生产系统的影响,造成这么大的停机事件竟然是因为一个小小的温度测量元件故障,这是如何都让人无法接受的。所以,针对此类过保护问题,应该采取的措施是,去除单一温度的保护连锁程序,改为同一测点附近的多个轴瓦温度测量元件(也可包括相应的回油温度),多个温度同时检测,采取3取2等多取多的方式,这样一个温度出现故障时,不会影响整个机组,保证生产顺利进行的同时也方便检修的开展。上述例子如图2。

修改前,任意温度超过100度就会引发停机命令

修改前,液位低于1.5发出过低报警触发停泵命令。

除了上述情况以外,过保护还存在一种情况,就是不必要的情况,应该尽量减少保护连锁程序的投入。举例说明,和炼铁高炉息息相关的高炉循环水泵站,负责冷却高炉炉体等,当这个泵站停止工作的话,高炉的安全就完全不存在。所以该泵站的重要性可想而知。在泵站的PLC控制程序中,各种保护连锁程序是少不了的。在一般的泵的工艺使用中,是将水加压输出,特别是将水池中的水加压输出。在高炉循环水泵站中有很多泵,甚至一些高压泵,柴油机泵等等都是这样工艺,目的是为了将水输出至高炉等设备。在泵的一般使用中,为了保护泵的使用安全,有这么一项考虑,就是在水位低时,发出警报,在水位更低,低至无法抽水,为了防止泵的空转,所以这时候要做停泵处理。这种想法在水泵站这种场所基本是常识,但是作为保护控制来说,可以换一种思路。对于如此重要的一个站点,有专业的操作人员监控操作,所以水池的水位一直会处于一个合适位置,不会轻易高出或者低出,甚至会略微溢出也不会让水位偏低,其次,就算液位偏低了,会有报警,一般配备声光报警器,足以引起操作人员去警惕,去抬高液位。所以,水池降到停泵的几率基本为0,经过长时间的考察,未发现本文作者周边的数个高炉泵站发生水池液位过低的现象,实际情况也可以印证。再来看看如果停泵了会发生什么情况,情况一,水池液位无问题,液位测量元件故障导致液位显示为过低,导致停泵,停泵引起高炉冷却水水压不够,对高炉产生不稳定因素;情况二,水池液位真的过低,这时,无论停泵与否,对高炉冷却水的影响是不可避免的,首先考虑的是如何保护高炉,泵空转一阵已经无碍大局,紧急往水池注水,也会需要泵开着。所以,本文分析看来,水池液位低触发停泵这条实在没必要,而且带来的隐患(液位波动或者检修液位导致液位显示为过低)确实很大,为了一个极端情况,而做了保护连锁程序,却带来了更大概率的非必要的停泵,以及更大概率的影响高炉,这种保护连锁程序,可以叫做过保护,应该解除。即使为了极端情况实在需要液位过低停泵这个保护连锁程序,也应该优化为排除掉液位测量元件故障的情况。如图3。

浅析程序的优化 篇6

程序优化指的是针对同一问题的不同程序进行比较、调整或修改,将程序变为语句比较少、内存占用量比较小、运行速度比较快的程序。优化是在时间与空间上尽可能达到一种平衡,它往往要以牺牲程序的可读性或者增加代码长度为代价。一般运行速度较快的算法需要较大的存储空间,而限制程序的存储空间往往会降低程序的运行速度。目前由于硬件的发展速度很快,一般程序对于所占内存空间要求不苛刻,因为内存容量完全可以满足程序的需求量,故本文的优化主要指的是在时间上的优化。当今嵌入式技术正进入快速发展期,大多数嵌入式软件开发中对于程序的执行速度有很高的要求,本文也是从这一出发点考虑优化程序的运行速度问题。以下通过一些具体实例讨论时间效率的改进策略及方法。

1 提取公共表达式

如果相同的表达式需要多次出现,那么应该增加变量来保存这一表达式的计算结果,从而可以避免多次相同的计算,在循环中更应该这样做。如 :

这个循环每次在判断条件时都需要重复计算sqrt(n),其中还涉及到库函数的调用,无谓地耗费了系统时间,应将结果恒定的计算提取到循环外面。改进后的代码如下 :

在访问二维字符数组时,常用列下标控制内循环,好多学生会写出下面的程序段 :

在内循环处的strlen(s[i]) 对于每一行也是固定值,不应该每次内循环都计算,应将其提到内循环之前,修改如下 :

2 将结果恒定的条件判断提到循环体外部

若循环体中存在分支语句,且其条件不随循环变化,则应将其移动到循环之前,可以避免多余的重复条件的判定,尤其是循环次数很多时优化效果明显。如 :

循环中的条件成立与否是不变的,将其置于循环体内增加了判定次数,应先判定条件再循环。这个优化是从运行速度角度进行的,但代码长度增加了。改进后的代码如下 :

3 将循环体展开

当循环体语句很少且循环次数较少时,可将循环体展开变成几条顺序结构的语句,从而节约了用于循环处理的开销。若原代码如下 :

循环只进行两次,循环体只有一条语句,可将其处理为如下顺序结构 :

a[0]=b[1]; a[1]=b[2];

又如想判定a[i] 是否连续大于其后面的三个数,若用循环处理如下 :

将循环比较改为一个分支语句中的多条件判定,不仅可以省去标志变量f的使用,还免去一层循环,必定可以提高运行效率。修改如下 :

if(a[i]>a[i+1]&& a[i]>a[i+2]&& a[i]>a[i+2])

……

4 用查表代替函数调用或复杂运算

如果程序中需要频繁使用某个功能,一般人们想到的是通过函数调用来实现,但如果可以有方法比函数调用更快,那将是好的选择。可以用一种以空间换时间的方法来提高速度,这就是很多程序员惯用的查表。查表就是先将多个运算结果存到一个数组中,然后在用的时候访问相应的数组元素。以下是计算阶乘的函数 :

使用查表的思想改写后如下 :

5 尽可能用低价操作完成运算

5.1使用平方运算代替开方运算

当开方运算出现在关系表达式中时,可以用平方代替开方运算得以变通,从而免去代价更大的开方运算,尤其是开方还得调用库函数,如i

5.2用移位完成乘除运算

左移一位相当于乘以2,相反地,右移一位等价于除以2,由于移位运算的执行速度要高于乘除运算,所以在需要进行乘除法的时候可以使用移位运算实现。如 :x=x*8; y=y/16;

可改为 :x=x<<3; y=y>>4;

若某个量 乘以或除 以2n,均可直接用移位法代替。如果是乘以任意整数,可以用移位与加减法配合得到结果,如 : n=n*9 ; 可改为 :n=(n<<3)+n ;

5.3将连除用乘法实现

除法在整数的运算中是最慢的,其运算时间相当于加法运算的28倍,乘法运算的21.5倍,故应尽量避免。如果是连除,可以将若干次除法的分母相乘,但由此可能会引起相乘时溢出的副作用,所以只能是在估计乘积不溢出时这样来处理。如: m = i / j / k;可改为m = i / (j * k) ;

5.4用指针访问数组

数组元素的引用有指针法和下标法两种,指针法方便灵活,数组法直观易懂,但经编译后用指针法比用下标法生成的目标程序短且效率高。若使用下标法,每次循环都要用数组起始地址与元素下标进行运算得出元素地址,然后访问对应元素。而指针法是用一个指针指向数组首元素,在循环中依靠指针下移指向每个元素对其进行访问,主要就是一个指针变量增1的简单运算。相比之下,显然指针法对于元素地址的计算要快得多。下面是一个典型的指针访问数组的函数。

5.5 减少循环层数、巧妙安排内外层循环

循环的层数越多时间复杂度越大,在复杂问题中,应尽可能将循环层数降到最少。在多层循环嵌套的程序中,内层循环开销要比外层大得多,所以次数少的尽量安排为外循环,次数多的尽可能安排到最内层,以减少内层循环的执行次数。

在杨辉三角形计算问题中第一列与对角线元素均为1,以下两种程序段都可以实现这个要求,显然单循环效率要高得多,而且还不需要多次的条件判定。

若题目要求用三个一位数构造出三位数,将三位数奇数中任两位相等的数输出,这个问题需要用到三层循环,控制百位数的变量bai从1取到9,控制十位数的变量shi从0取到9,控制个位数的变量ge从1取到9且为奇数,按照上述方法可用ge作为最外层循环控制变量,bai控制第二层,shi控制最内层,调整后的程序段如下 :

6 总结

每一个热衷学习程序设计的人都应该了解程序优化的一些常用方法和技巧,想要从事相关工作的人员更应该深入学习和研究各种优化手段。本文介绍的这些方法有可能会使降低程序的可读性,出现错误时调试难度会增加,但有一失必有一得,换来的是程序效率的提高。

摘要:学习程序设计的基础是掌握程序设计方法,进而可以自主完成算法的设计,在这一阶段应多角度考虑问题,尽可能思考出一个问题的多种解法,这样有利于开阔编程思路。在这多种解法中,对算法主体结构应分析其时间及空间复杂度,从中选出效率比较高的算法。在一种解法的具体实施过程中,也应对其深入分析进而优化得到运行效率较高的算法。文章通过若干实例论述了程序优化的部分方法,可以为教师进行算法设计或程序设计类课程的教学提供参考,也可以为学生或自学者深入学习程序设计提供指导。

系统程序优化 篇7

0 引言

Visual Basic是由微软公司推出的当今较为流行的一种可视化高级编程语言, 它界面友好、简单易学、功能强大, 即使是非计算机程序设计人员也可快速上手。无论是编写小程序还是大型软件, 一个优秀的软件开发人员, 在追求代码实现功能的同时, 还应该追求运行时的时间、空间的效率问题, 而后者常常被一些开发人员所忽略, 导致软件占用了大量的系统资源、运行速度慢, 增大了软件对系统的要求和维护难度。如何提高Visual Basic程序的性能[1], 使应用程序运行更加稳定、快速, 一直是众多编程者最为关心的问题。本文主要从以下两方面介绍Visual Basic程序优化的方法:

1 数据优化

选择正确的数据类型进行数据优化, 既可以减少存储开销, 又可以提高运行速度, 同时它也是最简单的方法。具体可采取以下措施:

(1) 尽可能使用Integer (整型) 或Long (长整型) 数据

在非数值计算的程序中, 可考虑将Currency (货币型) 、Single (单精度型) 和Double (双精度型) 数据更换为Long (长整型) 或Integer (整型) 数据[2], 尤其是在循环体中。这是因为Long型数据处理速度特别快。在Visual Basic中各种数值数据类型所占用的存储空间和运行速度如下表所示。

注:运行速度按由快到慢的顺序排列的。

即使是在数值计算的程序中, 如果对计算结果精度要求不是很高, 也可以将小数保存在长整型 (Long) 或Integer (整型) 的变量中。如要保留2位小数, 将保存在Long型变量中的值除以100即可得到想要的结果。使用Long型代替Single型, 虽然空间上没有什么变化, 但是运行速度将会提高约10倍。

(2) 使用常量

对于经常使用而其值又不变化的值, 建议使用常量而非变量, 这是因为程序在编译时就将常量直接计算并写入到代码中, 并非在运行时才进行计算, 这样在提高代码的执行速度的同时, 既增加了程序的可读性, 又便于维护。

对于没有用过的常量编译后将不会出现在程序中, 同样也可以减少内存的占用。

(3) 避免使用Variant变量

Visual Basic中的Variant类型变量非常灵活, 但系统会给该类型变量分配16个字节的存储空间, 而且在用变量进行运算时还要考虑到数据类型之间的转换。这既占内存, 又影响速度, 会使降低涉及到复杂运算的程序运行速度。特别需要注意的是, 在Visual Basic中一个变量如果没有声明, 默认的类型是Variant。

2 程序文件的优化

所谓程序文件的优化是指从所写代码中删除其中一些不必要的元素。当对应用程序进行编译时, Visual Basic会自动删除某些元素, 而对象注释、标识符名称、空行的长度或数量是没有限制的。同样当将应用程序生成为一个.EXE文件并运行时, 上述元素也不会影响程序所占用的内存空间。但是象变量、窗体、函数和过程等元素, 是要占用一定的内存空间的。程序文件的优化可从以下几方面进行:

(1) 减少加载窗体、控件数组

Visual Basic中加载的每一个窗体或控件, 不管其是否可见, 都要占用一定的内存空间。只有在需要显示时才加载窗体或控件, 当不再需要时应立即卸载, 而不是将其隐藏。所以在设计时应通过使用控件数组代替在窗体上放置多个同样类型的控件, 这是因为使用控件数组而添加的控件所耗费的内存容量比直接添加多个同样类型的控件的要少得很多。

(2) 尽量用标签代替文本框

因为文本框Textbox所占用的Windows资源比Label标签控件多, 所以在能使用Label标签解决的就不考虑使用文本框Textbox。在编写代码时, 可以通过对Label控件的属性 (如背景、边框、只读等属性) 的设置使其看起来很像文本框Textbox。

(3) 尽可能减少模块数量

在Visual Basic中, 即使只调用模块中的一个过程, 就会把整个模块加载到内存中, 所以在书写代码时, 尽可能把相关的过程放在同一个模块中, 以减少模块的数量。

(4) 避免直接使用图片等大容量文件, 改用磁盘文件或资源

在编写程序代码时, 如果应用程序直接使用图片和长文档等数据, 势必会增加应用程序运行时的空间开销, 然而当应用程序运行时直接从磁盘文件或资源中加载数据, 可大幅度地降低内存开销。

(5) 及时释放变量所占用空间

程序运行时, 系统要根据每一个变量的类型, 为其分配存储空间, 而当过程调用结束时, 系统将自动回收除静态局部变量外所占用的的存储空间。然而, 为全局变量和模块级变量所分配的存储空间一直要持续到整个应用程序结束, 所以及时回收这些变量所占用的存储空间对于提高空间效率显得尤其重要。要想使应用程序尽量小, 可利用以下方法:给字符串变量赋值为零长度字符串, 回收其空间;将对象变量赋值为Nothing部分回收该对象所占用的空间;卸载不再使用的窗体而不是隐藏。

(6) 使用动态数组代替固定数组

固定数组所占用的空间在整个程序运行期间保持不变, 当实际使用长度小于定义长度时, 存在严重的空间浪费情况[3]。因此, 应通过使用动态数组, 降低空间的浪费。当动态数组的数据发生变化时, 用Re Dim、Re Dim Preserve或Erase动态改变数组大小, 丢弃无用数据并释放所占用内存空间。

(7) 删除无用变量和死代码

在编写代码的过程中, 常常会存在以下情况:声明了一些从始至终都没有使用过的变量;代码中有没有被任何地方调用过的某一个过程, 这些代码称为死代码, 如Debug.Print语句。在生成.EXE文件时, Visual Basic虽然删除了一些无用的常量, 但对死代码和无用的变量并不作任何删除。所以在生成.EXE文件前, 我们需要查找代码中无用的变量和死代码, 并删除。

(8) 编译优化

除上述方法之外, 还可以在编译时通过选择进行代码的优化, 将工程文件编译为本机, 而非P-代码。具体操作步骤:在“工程”菜单下选择“工程属性”菜单项, 这时会弹出“工程属性”对话框, 单击其中的“编译”选项卡, 单击“编译为本机代码 (N) ”, 然后选择“代码大小优化”, 最后单击“确定”按钮。

总之, 优化程序既要从自己、从用户等多方面考虑, 又要从运行时间和占用空间等方面考虑, 同时在要速度和空间这对矛盾中做权衡, 使程序开发周期短, 且高效易用。

参考文献

[1]王东洋.基于虚拟设备的虚拟交换机设计[J].软件, 2012, 33 (1) :42-45

[2]马玉春, 苑囡囡, 王哲河.基于Visual Basic 2008的Access数据库类的设计[J].软件, 2012, 33 (6) :41-43

猪瘟免疫程序筛选优化研究 篇8

1 材料和方法

1.1 仪器、试剂

猪瘟免疫金标试纸条 (批号2006010) 购自郑州畜牧兽医专科学院畜禽疾病研究所;猪瘟疫苗 (批号200512) 购自辽宁省益康生物技术有限公司;试验母猪18头、试验育肥猪12头, 由锦州医学院畜牧兽医学院实习农场猪场提供。

1.2 试验方法

1.2.1 分组及免疫

选择日龄相近的经产母猪18头, 随机分成3组, 于产后30 d在颈部肌肉注射疫苗, 免疫剂量依次为1、4、5头份。于分娩前2周采血、分离血清, 用猪瘟免疫金标试纸条法检测猪瘟抗体。

1.2.2 试验母猪所产仔猪免疫

从上述4头份组母猪中选择抗体较高的3头, 待其产仔后, 从其3窝仔猪中每窝随机选择4头进行跟踪采血, 检测猪瘟抗体水平。跟踪采血日龄为20、30、40、60、80、100。

1.2.3 筛选优化生长育肥猪免疫程序

从4头份剂量免疫组母猪所产仔猪中每窝随机选择3头, 每组共9头, 最后获得4组试验猪, 共36头。4组分别采取表1中的免疫程序。

对4组试验猪进行跟踪采血检测抗体水平, 跟踪采血日龄为25、30、45、60、80、100、120。然后统计每组各日龄猪瘟抗体的平均值和阳性率。

2 结果分析

2.1 筛选母猪免疫程序,

确定仔猪猪瘟首免时间试验母猪猪瘟抗体检测结果见表2。结果表明, 4、5头份免疫组母猪平均抗体水平, 高于1头份免疫组, 且差异极显著 (p﹤0.01) 。4头份免疫组和5头份免疫组的母猪平均抗体水平差异不显著 (p﹥0.05) , 但5头份组的母猪平均抗体水平稍低于4头份组。

仔猪抗体消长情况如表3所示。猪瘟抗体水平在仔猪20日龄时平均为7.25, 阳性率为100%, 30日龄时猪瘟抗体水平平均为69, 阳性率为100%, 抗体水平仍然较高, 40日龄下降到4.67%, 抗体阳性率下降到61%, 至60日龄时, 猪瘟抗体水平较低, 平均为6.13, 阳性率仅为20%。因此, 仔猪猪瘟疫苗首免时间如确定在20日龄, 其猪瘟母源抗体过高, 不适合免疫。根据上述检测结果, 如采取上述母猪免疫程序, 仔猪猪瘟疫苗首免时间应确定在30~40日龄。

2.2 筛选优化生长育肥猪免疫程序结果

试验生长育肥猪跟踪采血检测抗体水平见表4。结果表明, 1组即20日龄2头份, 60日龄4头份免疫组, 猪瘟抗体水平在免疫试验猪30日龄以后到60日龄前均在4以下, 对猪瘟不具有有效抵抗力, 经60日龄二免后, 抗体有所提高, 80日龄检测猪瘟抗体水平达到4.4, 到120日龄维持在4以上, 但抗体水平较低, 最高仅为5.2, 阳性率在80%以下, 难以抵抗猪瘟强毒株的侵袭。试验组2、3、4三个组, 其平均猪瘟抗体水平从试验猪25日龄开始检测到120日龄, 均在4以上, 抗体阳性率在70%以上, 90%以上居多, 对猪瘟具有有效抵抗力;但从每个检测日龄的抗体水平比较, 始终是试验3组即30日龄4头份首免, 60日龄6头份二免试验组, 抗体水平最高, 抗体阳性率也最高;其余两组的猪瘟抗体水平和抗体阳性率均低于3组, 而试验2组低于试验4组, 试验4组略低于3组。

3 结论

通过检测试验猪内的猪瘟抗体水平, 研究制定了适合于不同养殖模式的猪瘟免疫程序, 即猪瘟常规免疫程序执行30日龄一免, 免疫剂量4头份, 60日龄二免, 免疫剂量6头份较为合适。母猪免疫程序:产后30 d或配种前10 d进行免疫, 免疫剂量4头份即可取得良好的免疫效果, 不必使用过大的剂量。

摘要:猪瘟是目前危害养猪业的主要疾病之一, 其主要控制方法是免疫。为了制定科学合理的猪瘟免疫程序, 特进行本试验。试验主要采用猪瘟兔化弱毒疫苗于不同日龄、不同剂量对母猪、生长育肥猪进行注射免疫, 然后定期采集试验猪血清检测猪瘟抗体水平。结果显示, 母猪于产后30d4头份剂量免疫, 其抗体水平保持最好, 至分娩前2周抗体仍保持在7d以上, 其所生仔猪母源抗体log2值4以上持续到40日龄以后;生长育肥猪30日龄4头份剂量首免, 60日龄6头份剂量二免。应坚持猪瘟抗体水平监测, 依据本场具体情况随时调整猪瘟免疫程序, 从而达到控制猪瘟的目的。

施工机械组合优化计算程序算法 篇9

1 对土方路堤填筑施工过程分析

对于大多数情况,尤其是流水作业时,施工机械都是循环利用。所以,只需选取一个施工周期作为分析对象。考虑到作业方式均为流水作业,即假定当机械完成某施工段作业后马上进入下一施工段的作业。其间发生的等待时间计入下一施工段(相当于在本施工段开始)。这样,只需要考虑计算机械在作业前和作业中的等待时间以及作业时间,有利于计算机械的工作时间,使得程序开发得到简化。

2 程序的主要功能

机械施工仿真程序的主要功能包括:施工过程的仿真计算分析,单位工作量直接成本(元/m3),各种施工机械的利用率分析,单位工作量施工时间(h/m3)。并采用流水作业的方法来分析路堤填筑的施工过程。根据程序分析结果来确定施工机械组合的优化,还可以根据分析结果来确定流水作业的最佳单位作业单元大小。

3 程序数据结构及算法

3.1 程序的输入输出

输入数据包括机械数据和作业数据两种。机械数据是已有的机械数据库中选取各工艺使用的机械及数量;作业数据指和工程仿真计算有关的工程数据。数据输入可采用人机交互的方式按照提示输入,也可以建立Excel文件直接导入程序。

程序输出数据采用两种方式:一种是通过程序的交互界面直接显示在屏幕上;另外一种是把数据导出到Excel。输出数据包括各机械的利用率、总的工作时间、直接成本。

3.2 数据结构

对每一类机械如自卸汽车建立一个数组,数组属性为MachClass。数组的第一个元素记录本组的整体信息,包括机械数量总功率、总的工作能力、总的工作时间、平均工作效率等。由于在某一个作业点,作业进行是按工艺的顺序来完成的,对机械类数组建立一个链。为了避免程序逆序访问数组,链只能单向读取。

3.3 程序的仿真计算算法

3.3.1 程序流程

机械化施工仿真计算程序流程按照工艺顺序分成若干个作业步骤,每个作业步骤都有与之对应的施工机械。在这里不考虑相邻步骤的施工机械在同一工作面同时工作的影响(实际上,合理划分作业单元时,可以减小甚至消除由此带来的误差)。也就是对任何非起始作业的工作,只有它的紧前工作完全结束时,才能开始工作。在程序中,按照不同的施工步骤建立独立的工作模块。具体的流程图见图1。

3.3.2 程序的数学模型

程序采用机械组合的总利用率、机械利用率及单位工作量费的直接成本来评价机械组合的有效性。在机械发生作业等时,费用发生只计算不变费用部分。计算式为:

3.3.3 程序实现过程中遇到的问题的处理

由于在施工的过程中,象压路机、平地机等机械有一部分叠的工作量,这部分工作量处理方法有两种:1)根据机械的重宽度将作业量乘当量系数,得到当量工作量。2)对机械的工作度进行折减,得到有效工作宽度。本程序采用第二种方法。

各作业间的数据传递采用自定义机械类MachClass的属性的修改来完成。同时用机械类的属性值来记录机械所处工作状态、工作/等待的时间及机械的性能参数。

程序通过修改机械类属性MachClass.Machstate=工作/等来确定机械所处的状态。通过上一施工过程生产的工作量与一个施工过程机械的剩余生产能力(处于等待状态机械的生产力)的差值来确定作业的进行程度和机械所处的状态。并根据机械运行的时间来修改属性MachClass.Worktime和MachClass.Attime来记录机械的运行和等待的时间。由此可以计算出各机械利用率MachClass.Effeciency和各机械耗费的直接成本MachClass.Cost。

程序采用使用时间因子的方法来模拟施工过程中消耗的间。在施工开始时,随机产生一时间因子,所有机械的起始时都采用这一因子。机械所消耗的时间在起始时间因子的基础延迟。在延迟时间段内,表示机械处于使用中,否则处于闲置中并采用一计数器记录任何时刻与起始时刻的时间差。为了使录时间单位与机械台班价格相对应,每一个时间因数表示实际工时间为1 h。

4 实践运用

重庆市政道路设计等级为城市快速路,总长5.2 km。文中取了其中的一层作为仿真计算对象,长度为500 m。仿真分析的任务是得到直接成本达到最小的机械组合。取土场离施工现场的平均运距为2 km,路基宽度为15 m(分析层实际施工宽度),松铺厚度40 cm。选配的施工机械及配套方案:2台Cat950B装载机,10 t的自卸汽车若干,1台140推土机,1台PY160平地机,1台12 t的光轮压路机稳压1遍,CA-25 t振动压路机两台各振压2遍,1台179SE压路机作封层碾压。

分析时选用自卸汽车作为分析对象,即在不同的机械组合里选用不同数量的自卸汽车。组合一:选用5台自卸汽车;组合二:选用6台自卸汽车;组合三:选用7台自卸汽车;组合四:选用8台自卸汽车。分析的结果如表1所示。

由分析可知,机械组合经优化后,组合三直接成本节约率高达21%(相对组合一)。机械组合三的直接成本最低,为优化后组合。把组合三运用到工程实践,实际耗费的工程直接成本单价为2.899元/m3。

5 结语

实践证明,通过对工艺的分析和施工过程模拟的简化,采用仿真计算的方法可以对机械组合进行优化。把这种方法在浙江某公司进行推广,现场施工技术人员能较快的掌握并应用这种方法来指导施工,甚至把它推广至隧道的开挖,产生了较好的经济效益。由于机械原始工作参数(如自卸汽车的速度,每车的装运量)是随机的,但是从统计角度来看,它们的平均值是稳定的。这就要求现场施工技术人员对现场机械的作业性能比较熟悉,这是有效使用仿真计算分析方法的关键所在。

摘要:通过对机械施工过程的分析,建立了一个比较简单的数学模型和模拟算法,降低了仿真分析程序的难度,分析解决了程序模拟工程中遇到的一些难题,并把这个优化计算方法运用到具体工程中,指出仿真计算程序可以对机械组合进行优化,并且指导现场施工管理。

关键词:机械化施工,机械组合优化,仿真计算

参考文献

[1]巫世晶,贺小明,何小新,等.大坝碾压混凝土浇筑及施工机械配套的仿真研究[J].红水河,1999(2):35-38.

[2]钟登华,李景茹,刘奎建,等.全过程动态仿真技术及其在大型工程施工管理中的应用[J].天津大学学报,2003,36(3):347-352.

上一篇:庄子的生死观下一篇:品德与生活教学策略