【感悟】——逻辑的重要性-循环里不要套IO操作
2016-03-13 23:19
465 查看
对于逻辑的重要性,不知道大家有多少感悟。我今天的感受,主要来源于和四姐的交流。
在这之前,我不是没听说过逻辑,也不是不知道逻辑的重要性。但在脑海中也就是:嗯,逻辑很重要,仅此而已。根本没有深入的去思考。
举例说明:
学生登录后,看到评教界面。每条教师课程信息后对应一条评估状态。
![](https://img-blog.csdn.net/20161021121018728?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
教师姓名、课程类型、课程名称从基础获得。返回到teacherCourseList集合中,而评估状态在评教的表中。为了让二者联系起来,我的思路是这样的:
教师课程信息返回后,反到teacherCourseList中,其中包括教师课程信息,和教师课程ID,然后foreach循环,去EvaluationAssessRecord表中(表中包括学号、教师课程ID、和评估记录)遍历查找该学生的该教师课程有无评估记录。有则显示已评估,无则显示尚未评估。
这是我的部分源码:
有经验的人一看可能就知道问题所在了。那就是foreach里套了方法,而且还是从数据库查询的方法。这说明,teacherCourseList里有多少条数据,就会有多少次对数据库的IO操作。当大量学生登录时,这将会对服务器造成很大的压力。并且评估记录表的数据在评教过程中不断增加,大约一个学生就要增加15条数据。如:这个学生有10门课程,他前面已经有1000人进行了评教,评估记录表里大约就有:1000*10条数据。也就是该生登录后,会进行10次IO操作,并且每次都要遍历10000条数据。而如果这场有400人进行评教,将对数据库进行4000次IO操作。
大家都知道,评教的时候,服务器的压力是很紧张的。所以我这样的代码,纯粹是想将评教至于死地啊。今天和四姐交流后,才发现了这一点。我这脑壳啊......
看修改后的代码:
哈哈,看到区别没有。经过改造。一个学生只进行一次对数据库的IO操作。由原来的10次变为1次。
我们学校每年进行评教的学生大约有两万人。也就是,按原来的逻辑,要进行20万次对数据库的访问。但现在只需要两万次。减少了十八万次。有没有很激动。而这只是评教系统中的一个小小细节。我想,经过我之后用脑分析,多去思考。肯定会将评教优化的更完美。同样,大家都多思考。我们的ITOO性能一定会有大幅度提升。so,加油啦。
在这之前,我不是没听说过逻辑,也不是不知道逻辑的重要性。但在脑海中也就是:嗯,逻辑很重要,仅此而已。根本没有深入的去思考。
举例说明:
学生登录后,看到评教界面。每条教师课程信息后对应一条评估状态。
教师姓名、课程类型、课程名称从基础获得。返回到teacherCourseList集合中,而评估状态在评教的表中。为了让二者联系起来,我的思路是这样的:
教师课程信息返回后,反到teacherCourseList中,其中包括教师课程信息,和教师课程ID,然后foreach循环,去EvaluationAssessRecord表中(表中包括学号、教师课程ID、和评估记录)遍历查找该学生的该教师课程有无评估记录。有则显示已评估,无则显示尚未评估。
这是我的部分源码:
//判断本地是否有该学生在该教师课程关系下的评估记录,如果有则取出评估状态,如果没有,则添加一条评估记录,评估状态为尚未评估。 foreach (var teacherCourse in teacherCourseList) { //定义评估记录实体 EvaluationAssessRecordEntitity enRecord = new EvaluationAssessRecordEntitity(); //给评估记录实体赋值 enRecord.StudentId = teacherCourse.StudentID; enRecord.EvaluationTeacherCourseEntityTeacherCourseId = teacherCourse.ID; //根据教师课程id和学号查询是否存在该学生在该教师课程关系下的评估记录,如果存在,则取出评估状态,如果不存在则添加评估记录,状态为未评估。 var recordResult = this.DbSession.StateEvalDal.QueryByTeacherCourseIdAndStudentId(enRecord); if (recordResult.Count > 0) { //如果存在情况下,则取出评估状态记录 assessStatus.AssessStatus ="已评估"; } else { //为评估状态数据契约实体的评估状态赋值 assessStatus.AssessStatus = "尚未评估"; } }
有经验的人一看可能就知道问题所在了。那就是foreach里套了方法,而且还是从数据库查询的方法。这说明,teacherCourseList里有多少条数据,就会有多少次对数据库的IO操作。当大量学生登录时,这将会对服务器造成很大的压力。并且评估记录表的数据在评教过程中不断增加,大约一个学生就要增加15条数据。如:这个学生有10门课程,他前面已经有1000人进行了评教,评估记录表里大约就有:1000*10条数据。也就是该生登录后,会进行10次IO操作,并且每次都要遍历10000条数据。而如果这场有400人进行评教,将对数据库进行4000次IO操作。
大家都知道,评教的时候,服务器的压力是很紧张的。所以我这样的代码,纯粹是想将评教至于死地啊。今天和四姐交流后,才发现了这一点。我这脑壳啊......
看修改后的代码:
string studentID = teacherCourseList[0].StudentID; List<EvaluationAssessRecordEntitity> record = new List<EvaluationAssessRecordEntitity>(); //根据学号在评估记录里查询出该学生的评估记录,最多为该学生的课程数,即最多10条。-赵寒-2016-3-13 //目前为止,进行了一次IO操作。 record = this.DbSession.StateEvalDal.QueryRecordByStudentID(studentID); //评估状态默认为尚未评估-赵寒-2016-3-13 assessStatus.AssessStatus ="尚未评估"; //循环查询出的评估记录 for (int i=0,i<record.Count,i++) { //循环该学生的课程 for(int j=0,j<teacherCourseList.Count,j++) { //如果两个信息的ID相同,说明该课程已评估,则评估状态返回已评估。 if(record[i].EvaluationTeacherCourseEntityTeacherCourseId==teacherCourseList[j].ID) { assessStatus.AssessStatus ="已评估"; } } }
哈哈,看到区别没有。经过改造。一个学生只进行一次对数据库的IO操作。由原来的10次变为1次。
我们学校每年进行评教的学生大约有两万人。也就是,按原来的逻辑,要进行20万次对数据库的访问。但现在只需要两万次。减少了十八万次。有没有很激动。而这只是评教系统中的一个小小细节。我想,经过我之后用脑分析,多去思考。肯定会将评教优化的更完美。同样,大家都多思考。我们的ITOO性能一定会有大幅度提升。so,加油啦。
相关文章推荐
- c#调用COM组件
- C#实现把指定数据写入串口
- C#动态创建button的方法
- C#中抽象方法与虚拟方法的区别
- c#中虚函数的相关使用方法
- C#实现给图片加水印的方法
- C#使用加边法计算行列式的值
- C#实现多线程的同步方法实例分析
- C#中尾递归的使用、优化及编译器优化
- C#中的delegate委托类型基本学习教程
- C#实现子窗体与父窗体通信方法实例总结
- C#通用邮件发送类分享
- 举例讲解C#中自动实现的属性
- C#中this的用法集锦
- C#数据结构之顺序表(SeqList)实例详解
- C#.NET获取拨号连接的宽带连接方法
- C#异步绑定数据实现方法
- C#实现AddRange为数组添加多个元素的方法
- C#中Equality和Identity浅析
- C#比较二个数组并找出相同或不同元素的方法