为了提升性能,应关注代码的每个细节
2009-10-15 17:41
447 查看
今天不是太忙,想着上次写的代码还没有做测试,于是写了一个类模拟代码功能做测试:
1:demand
从数据库里读出来要下发短信的记录----->下发短信------>更改记录状态(即下发完成以后更新数据库)
2:实现方法:
a:多线程下发,下发一条完成以后,就更新到数据库
b:多线程下发,先更新内存中记录的状态,下发全部完成以后再从内存里批量更新到数据库
当数据库大时,为了提高处理效率,显然我选择第二种方案
3:code(模拟代码)
public class BatchTest {
private static final int SENDTIMES_ONCE = 100;
private static int count2;
/**
* @param args
*/
public static void main(String[] args) {
List<Integer> list = setListValue();
updCacheToDB(list);
}
public static List<Integer> setListValue(){
List list = new ArrayList();
for(int i=0;i<1000893;i++){
list.add(i);
}
return list;
}
public static void updCacheToDB(List<Integer> smsAlertsList){
LinkedList<Integer> tempList = new LinkedList<Integer>();
long startTime = System.currentTimeMillis();
int count = 0;//计数
if(smsAlertsList!=null){
//当下发数量小于SENDTIMES_ONCE
if(smsAlertsList.size()<SENDTIMES_ONCE){
updBatchToDB(smsAlertsList);
}
else{//当下发数量大于SENDTIMES_ONCE
for(Integer po:smsAlertsList){
//添加到集合
tempList.offer(po);
if(tempList.size()==SENDTIMES_ONCE){
updBatchToDB(tempList);
count++;
}
//当最后数量不到SENDTIMES_ONCE时,更新到数据库
if(smsAlertsList.size()-count*SENDTIMES_ONCE<SENDTIMES_ONCE){
updBatchToDB(tempList);
}
}
}
}
long endTime = System.currentTimeMillis();
System.out.println("用时"+(endTime-startTime)/1000+"秒");
}
public static void updBatchToDB(List smsAlertsList){
for (int i = 0; i < smsAlertsList.size(); i++) {
//更新已经下发次数
System.out.print(smsAlertsList.get(i)+" ");
}
count2++;
//清空集合
smsAlertsList.clear();
System.out.println("第"+count2+"行");
}
}
测试时发现到1000000以后的数据都是每一条执行一次,而不是批量操作的,后来发现问题出现在
//当最后数量不到SENDTIMES_ONCE时,更新到数据库
if(smsAlertsList.size()-count*SENDTIMES_ONCE<SENDTIMES_ONCE){
updBatchToDB(tempList);
}
应该放在for(Integer po:smsAlertsList){
//添加到集合
tempList.offer(po);
if(tempList.size()==SENDTIMES_ONCE){
updBatchToDB(tempList);
count++;
}
}的外面而不是放在里面!
4.ArrayList和LinkedList 在大数据量添加的时候,性能比较
测试代码数据量是:1000893
功能:设值和取值
上面代码用LinedList,测试时间是18秒
ArrayList ,测试时间是23秒
当然这有时取决于你cpu占用率,可能每次测试时间不一样,但此代码里用LinkedList永远比ArrayList节省时间些
他们之间的差异原因是:他们底层数据结构不一样,不知道的朋友可以找找这方面的文章
5:我们在写代码时应该多做测试,重构,关注代码的每一个实现细节,这样才能写出来高性能的程序
1:demand
从数据库里读出来要下发短信的记录----->下发短信------>更改记录状态(即下发完成以后更新数据库)
2:实现方法:
a:多线程下发,下发一条完成以后,就更新到数据库
b:多线程下发,先更新内存中记录的状态,下发全部完成以后再从内存里批量更新到数据库
当数据库大时,为了提高处理效率,显然我选择第二种方案
3:code(模拟代码)
public class BatchTest {
private static final int SENDTIMES_ONCE = 100;
private static int count2;
/**
* @param args
*/
public static void main(String[] args) {
List<Integer> list = setListValue();
updCacheToDB(list);
}
public static List<Integer> setListValue(){
List list = new ArrayList();
for(int i=0;i<1000893;i++){
list.add(i);
}
return list;
}
public static void updCacheToDB(List<Integer> smsAlertsList){
LinkedList<Integer> tempList = new LinkedList<Integer>();
long startTime = System.currentTimeMillis();
int count = 0;//计数
if(smsAlertsList!=null){
//当下发数量小于SENDTIMES_ONCE
if(smsAlertsList.size()<SENDTIMES_ONCE){
updBatchToDB(smsAlertsList);
}
else{//当下发数量大于SENDTIMES_ONCE
for(Integer po:smsAlertsList){
//添加到集合
tempList.offer(po);
if(tempList.size()==SENDTIMES_ONCE){
updBatchToDB(tempList);
count++;
}
//当最后数量不到SENDTIMES_ONCE时,更新到数据库
if(smsAlertsList.size()-count*SENDTIMES_ONCE<SENDTIMES_ONCE){
updBatchToDB(tempList);
}
}
}
}
long endTime = System.currentTimeMillis();
System.out.println("用时"+(endTime-startTime)/1000+"秒");
}
public static void updBatchToDB(List smsAlertsList){
for (int i = 0; i < smsAlertsList.size(); i++) {
//更新已经下发次数
System.out.print(smsAlertsList.get(i)+" ");
}
count2++;
//清空集合
smsAlertsList.clear();
System.out.println("第"+count2+"行");
}
}
测试时发现到1000000以后的数据都是每一条执行一次,而不是批量操作的,后来发现问题出现在
//当最后数量不到SENDTIMES_ONCE时,更新到数据库
if(smsAlertsList.size()-count*SENDTIMES_ONCE<SENDTIMES_ONCE){
updBatchToDB(tempList);
}
应该放在for(Integer po:smsAlertsList){
//添加到集合
tempList.offer(po);
if(tempList.size()==SENDTIMES_ONCE){
updBatchToDB(tempList);
count++;
}
}的外面而不是放在里面!
4.ArrayList和LinkedList 在大数据量添加的时候,性能比较
测试代码数据量是:1000893
功能:设值和取值
上面代码用LinedList,测试时间是18秒
ArrayList ,测试时间是23秒
当然这有时取决于你cpu占用率,可能每次测试时间不一样,但此代码里用LinkedList永远比ArrayList节省时间些
他们之间的差异原因是:他们底层数据结构不一样,不知道的朋友可以找找这方面的文章
5:我们在写代码时应该多做测试,重构,关注代码的每一个实现细节,这样才能写出来高性能的程序
相关文章推荐
- C++ windows多线程 线程描述了进程内代码的执行路径。进程中同时可以有多个线程在执行,为了使他们能够同时运行,操作系统为每个线程轮流分配CPU时间片,为了充分地利用CPU提高软件产品的性能,一
- java 性能优化:35 个小细节,让你提升 java 代码的运行效率
- Java性能优化:30个小细节,提升Java代码运行效率
- java 性能优化:35 个小细节,让你提升 java 代码的运行效率
- java 性能优化:35 个小细节,让你提升 java 代码的运行效率
- java性能优化:35个小细节让你提升java代码的运行效率
- JAVA性能优化:35个小细节让你提升java代码的运行效率
- JAVA性能优化:35个小细节让你提升java代码的运行效率
- 合理利用运算符优先级,性能优化提升细节起
- 教你50招提升ASP.NET性能(六):为了生动的用户体验,总是在客户端验证
- 转载:修改一行SQL代码 性能提升了100倍
- 学习项目代码总结(一)—— ListView的自定义Adapter的性能提升与注意事项
- AS3分享34个flex as3代码细节性能优化
- JAVA 开发中一些提升性能的关注点
- 在细节上提升你的程序的性能
- JAVA 开发中一些提升性能的关注点
- 一名开发者修改了 composer 一行代码,性能瞬间提升,看完评论我也是醉了
- 影响Java代码性能的一些细节
- jQuery代码性能小细节
- 修改一行SQL代码 性能提升了100倍