分享工做中一次优化程序的过程

 

程序应用场景:

年初从总公司交接了一个评分系统,系统大概状况是80w考生,每一个考生105条做答数据,做答数据主要是客观题(单选题,多选题,判断题),评分时间大概40分钟左右。数据库

需求:优化代码,提高评分效率,优化以后评分完成在20分钟左右。多线程

已有代码优化逻辑:

1.程序方面:

多线程,经过计算评分的人数,获得须要的线程数量,开启线程分别进行评分学习

2.查询数据:

成绩表创建自增加Id,查询匹配须要评分的数据用where id> =Start and id< End测试

3.插入数据:

采用DataTable数据导入到Sql Server,提示评分完成时保存数据效率优化

详细说一下第二点的逻辑spa

假设数据库有100w条须要评分的数据,这时经过计算大概获得须要开启25个线程去同时进行评分,也就是说第一个线程去评分数据库Id在  1~40000考生的数据,也就是说去查询数据时,大概查询语句select * from A where Id>=1 and Id<40000这样可以保证查询出来得效率是最高的;线程

可是这里会有缺陷,若是数据存在删除过在插入确定数据就不是连续的,也就是3d

where Id>=1 and Id<40000不能保证查询获得40000条数据,数据库表中存在的Id不必定是从1开始,因此目前这种查询方式是很理想化的。后续这里还须要在这快研究和学习下。blog

本次优化细节

代码片断1

优化前:内存

 

优化后:

 

 

总结:提取线程内查询数据存储到内存中,从而只会查询一次。

代码片断2

优化前:

 

优化后:

 

总结:修改List集合取一条数据的方式,Where修改为Find,若是还须要在这里提高查询效率能够修改为for循环,但会致使代码可读性会变差。

代码片断3

优化前

 

优化后

 

 

总结:修改DataTable表Select查询方式,先存储到Dictionary中,在经过Key去取对应的数据。

最后经过测试所有完成评分时间大概20分钟左右,也算成功的完成了这个任务,可能还须要在研究研究代码,看可否有其余地方能够改善的。

存在的疑惑:

线程运算占用的电脑Cpu的具体的值?

是否存在最佳线程数量?

电脑Cpu处理能力越强是否也可以提高程序的评分效率?

总结:

1.线程里反复查询并且不变的基础数据放到线程外查询存储到变量中

2.List集合的Where查询修改为Find查询,极高的提高查询效率

3.DataTable的Select改用Dictionary<string,DataRow[]>,一样极高的提高查询效率

此次可以站在前人的肩膀上完成这一次代码的优化还有学习到了不少,瑾以写在这片文章分享我的在平时工做中的解决的一些问题,但愿此次可以经过分享此篇文章让本身更多的去记录和分享工做中遇到以及解决的问题,提高本身的竞争力。

相关文章
相关标签/搜索