Java性能优化之数据结构实例代码

时间:2022-06-18 02:36:07

—举例(学生排课)—

正常思路的处理方法和优化过后的处理方法:

比如说给学生排课。学生和课程是一个多对多的关系。

Java性能优化之数据结构实例代码

按照正常的逻辑 应该有一个关联表来维护 两者之间的关系。

Java性能优化之数据结构实例代码

现在,添加一个约束条件用于校验。如:张三上学期学过的课程,在排课的时候不应该再排这种课程。

Java性能优化之数据结构实例代码

所以需要出现一个约束表(即:历史成绩表)。

Java性能优化之数据结构实例代码

即:学生选课表,需要学生成绩表作为约束。

—方案一:正常处理方式—

当一个学生进行再次选课的时候。需要查询学生选课表看是否已经存在。

即有如下校验:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
//查询 学生code和课程code分别为 a 和 b的数据是否存在
 
//list集合中存放 学生选课记录全部的数据
list<studentrecordentity> liststudentrecord=service.findall();  
//查询数据,看是否已经存在
studentrecordentity ensr=liststudentrecord.find(s=>s.学生code==a && s.课程code==b);
if(ensr==null){
  //学生没有选该课程
  //....
}else{
  //学生已经选过该课程
  //....
}

对于上面这种代码的写法,非常的简练。而且也非常易懂。

首先,假设有5000个学生,100门课程。那么对于学生选课的数据集中,数据量将是5000*100.数据量会是十万级别的数量级。

在十万条数据中,查询学生=a课程=b的一条记录。执行的效率会很低。因为find方法的查询也就是where查询,即通过遍历数据集合来查找。

所以,使用上面的代码。在数据量逐渐增长的过程中,程序的执行效率会大幅度下降。

ps:数据量增长,在该例子中并不太适合。例子可能不太恰当。总之,大概就是这个意思。)

—方案二:使用内存进行优化效率—

这种做法,需要消耗内存。或者说把校验的工作向前做(数据的初始化,在部署系统的过程中进行)。即:在页面加载的时候数据只调用提供的public方法进行校验。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
//学生code 到  数组索引
private dictionary<string,int> _dicstudentcodetoarrayindex;
//课程code 到  数据索引
private dictionary<string,int> _diccoursecodetoarrayindex;
//所有学生
list<studententity> liststudent=service.findallstudent();
//所有课程
list<courseentity> listcourse=service.findallcourse();
//所有 学生选课记录
list<studentcourseentity> liststudentrecord=service.finall();
private int[,] _connstudentrecord=new int[liststudent.count,listcourse.count];
//构造 学生、课程的 数组 用于快速查找字典索引
private void generatedic(){
    for(int i=0;
    i<liststudent.count;
    i++)
        _dicstudentcodetoarrayindex.add(liststudent[i].code,i)
}
for(int i=0;
i<listcourse.count;
i++){
    _diccoursecodetoarrayindex.add(listcourse[i].code,i)
}
}
//构造学生选课 匹配的 二维数组。 1表示 学生已选该课程
private void generatearray(){
foreach(studentrecordentity sre in liststudentrecord){
    int x=_dicstudentcodetoarrayindex[sre.学生code];
    int y=diccoursecodetoarrayindex[sre.课程code];
    connstudentrecord[x,y]=1;
}
}
//对外公开的方法:根据学生code 和课程code 查询 选课记录是否存在
/// <returns>返回1 表示存在。返回0表示不存在</returns>
public void verifyrecordbystudentcodeandcoursecode(string pstudentcode,string pcoursecode){
int x=_dicstudentcodetoarrayindex[pstudentcode];
int y=_diccoursecodetoarrayindex[pcoursecode];
return connstudentrecord[x,y];
}

—性能分析—

分析一下第二种方案的表象。

1、方法很多。

2、使用的变量很多。

首先要说一下。该优化的目的,是提高学生在选课的时候,所出现的卡顿现象(校验数据量大)。

分别对以上两种方案进行分析:

假设学生为n,课程为m

第一种方案:

时间复杂度很容易计算第一种方案最小为o(nm)

第二种方案:

1、代码多。但是给用户提供的只有一个verifyrecordbystudentcodeandcoursecode方法。

2、变量多,因为该方案就是要使用内存提高效率的。

这个方法执行流程:1、在dictionary中使用code找index2、使用index查询数组。

第一步中,dictionary中查询是使用的hash查找算法。时间复杂度为o(lgn)时间比较快。第二步,时间复杂度为o(1),因为数组是连续的使用索引会直接查找对应的地址。

所以,使用第二种方案进行校验,第二种方案时间复杂度为o(lgn+lgm)

—总结—

通过上面的分析,可以看出,内存的付出是可以提高程序的执行效率的。以上只是一个例子,优化的好坏取决于使用的数据结构

以上就是本文关于java性能优化之数据结构实例代码的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

原文链接:http://blog.csdn.net/lee_sire/article/details/54024091