分享工做中一次優化程序的過程

 

程序應用場景:

年初從總公司交接了一個評分系統,系統大概狀況是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[]>,一樣極高的提高查詢效率

此次可以站在前人的肩膀上完成這一次代碼的優化還有學習到了不少,瑾以寫在這片文章分享我的在平時工做中的解決的一些問題,但願此次可以經過分享此篇文章讓本身更多的去記錄和分享工做中遇到以及解決的問題,提高本身的競爭力。

相關文章
相關標籤/搜索