这几天,由于工作的原因对以前开发的系统进行了测试。这个系统主要作用就是传输数据,将一个数据库的数据搬到另外一个数据库中,期间可能需要通过Internet,而目标的接收者也不一定再线的这么一个咚咚。
测试了两种数据库,分别对其进行数据转入转出处理。常被人说你写的程序效率低,不可用。其实不然,这次测试发现原来配置非常重要:
1) 编码
由于程序使用Java写的,又要兼容各个不同的数据库,因而需要对字符串型的数据进行编码转换。
String str = new String(rs.getString(i).getByte(databaseEncoding));
当数据量小的时候,察觉不出来,当数据量大时就发现这个消耗有些惊人。
if(databaseEncoding.equals(fileEncoding)){
return new String(rs.getString(i).getByte(databaseEncoding));
}
经过更改后,当fileEncoding和databaseEncoding时,数据处理效率提高5倍以上。
2)硬盘
在做测试时,当数据库与应用在同一台机器上时,发现硬盘灯从来就没有熄灭过。移开应用程序到另外一台机,重现测试,发现性能至少提高50%。这和我以前的经验相反。经过分析发现,原来我使用的是笔记本,硬盘只有4200rpm。当数据量大时,硬盘根本应付不过来。分开应用后,JDBC写入数据的网络通信开销要小于硬盘资源争夺的开销,速度当然提上去了。
看来不同环境下同一应用,做测试结论不一定都相同。
3)综合损耗
做测试时,发现系统最优性能既不是数据较小时,也不是数据最大时,而是在一个中间值。分析发现,程序运行有一些“综合损耗”,这些综合损耗不论你数据大或小都客观存在,如取数据连接、格式校验等。当数据量小时,这些损耗占的时间比重就多,而当数据量大时,虽然这些综合损耗占的比重少,但是数据量大占的“动态损耗就多了”。只有在中间某一个值时,两种损耗都不是特别显现时,系统运行的效率达到了最高值。