程序优化及问题处理经验总结
文:书心 | 2016-03-12 20:53:49
从15年3月跳槽进入这一家公司到现在已经差不多一年时间,这一年里接手的程序以及自己新开发的程序都不在少数,尤其是对于接手过来的程序,由于没有正式的交接过程,也没有相关的交接文档,甚至连基本的设计文档也没有,因此实际中,一旦发现问题,我能做的首先就是去看别人的代码,因此可以说这一年,我是因祸得福,积累到了一些可贵的程序优化和以及各种程序问题处理的经验,今天统一做一个总结,下文所说的都是笔者在实际项目中遇到的由于程序的设计和编写而导致了各式各样的问题,有点问题甚至花了很大的力气才定位到问题,可能读者看到这些问题并不会有强烈的共鸣,因为我所要说的的确是一些很普通的,往往容易让我们忽略的问题,可是就是这些微不足道的细节,往往在实际中导致了重大问题的出现,因此程序的设计过程是一门艺术,程序的设计和编写需要的除了遇到问题处理问题的耐心,还需要编项目前期编写代码的细心。
<1> new出来的内存使用结束后不按时释放;
C和C++里堆内存由程序员手动进行申请和释放,因此这往往是程序员容易忽略的细节,new出来的内存如果不手动进行释放,将导致内存在整个程序运行期间一直处于占用状态,如果是在一个循环中进行了new操作而没有进行对应的释放动作,那服务器的内存将会不断被耗尽,最终哦你导致程序无法运行。
<2> 类型之间胡乱转换;
这个问题可能是一个更加普通的问题,因为我们平时在编写程序时,经常会使用类型强制转换操作。我遇到的一个由于类型转换导致的问题是读取一个较大的文件时,函数中用一个long类型的变量返回文件读取的偏移量,而在实际函数调用中,粗心的程序员却用一个int类型的变量去接受文件读取后的偏移量,然后将该偏移量的值保存到进度文件,到这读者有没有发现问题呢?? 是的,问题就在于用一个int类型的变量去接受一个long类型的变量,我们平时写的程序里可能数据值比较小的情况下(没有超过int类型表示范围)long类型转换为int类型是不会发生数据截断的,而对于一个较大的文件(可能数百G),偏移量往往已经超出了int类型能表示的范围。因此在强制转换中可能会导致int类型超出表示范围而变成一个负值,因此也是笔者发现的问题:文件读取成功,但是程序记录的进度却奇怪的变成了负数问题了。
<3> 变量未经初始化就是用;
对于很多内置类型而言,变量在声明时编译器自动进行了初始化操作,比如int类型,而有些类型声明时编译器不做初始化处理,比如long类型,因此在使用long类型时必须先进行初始化才能进行算术运算操作,否则将导致奇怪的结算结果,因为未经初始化的long类型变量将会是一个随机数。
<4> 不注意异常的捕获和处理;
可能对于经验不足的程序员,这个是容易忽略的部分,尤其是数据库操作,必须使用try,catch语句囊括起来,否则在发生操作异常时,将导致整个程序异常退出。
<5> I/O操作后不及时关闭打开的文件和目录;
所有的io操作,文件操作,目录操作等,打开操作一般都必须对应一个关闭操作,如果只打开不关闭,可能导致服务器的句柄数超过最大数量
浙公网安备 33010602011771号