昨天下午修復了系統的bug(這個bug居然能佔很是高的資源,並且會影響到系統的核心服務。。。),就是下面的這兩段代碼,形成的bug。(不過這個bug僅存在於Ubuntu共享目錄下,在非共享目錄和window系統中均不會出現這個bug),最終使用foreach方法。html
//計算長度1000/60s /*for(int i=0;i<picIpDir.list().length;i++) {*/ //省掉計算長度時間 /*int m = picIpDir.list().length; for (int i = 0; i <m; i++) {*/ //省掉計算長度1000/60s for(String fileName:picIpDir.list()) { //省掉獲取文件時間1000/60s // String fileName = picIpDir.list()[i]; if ((fileName.indexOf("SnapshotSubface") > 0) && (isBetween(fileName, requestImage.startTime, requestImage.endTime))) { File readfile = new File(picIpDir.getAbsolutePath() + File.separator + fileName); String imageContect = getImageBase64(readfile.getAbsolutePath()); if (imageContect != null) { rtnList.add(imageContect); } } } return rtnList; }
自我感受,多是Ubuntu下計算文件夾下文件數組的長度和經過下標取圖片名花費了資源(Ubuntu共享目錄是經過路由的方式,共享windows文件夾到Ubuntu下面的。)經過foreach能夠省去計算文件夾下文件長度和經過下標取圖片名。使用foreach循環遍歷數組和集合時,無需得到數組和集合的長度,無須根據索引來訪問數組元素和集合元素,foreach循環自動遍歷數組和集合的每個元素。java
經過測試發現windows
for(int i = 0; i < picIpDir.list().length; i++) //測試方法 int m = picIpDir.list().length; for (int i = 0; i <m; i++)
每次要對list長度進行計算,1000個圖片 ,須要68s數組
String fileName = picIpDir.list()[i]; //取下標60s
取圖片文件名,1000個圖片,時間:64241毫秒————————64秒oop
而後對java的for循環進行了學習也就明白了for循環的具體用法調優,參考博文:http://www.360doc.com/content/11/0527/11/987036_119734904.shtml學習
package stytle; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** * @author buru * @date 2009年11月29日15:04:04 * @qq 258274473 * @email shaliebao@163.com * */ public class ForLoop { /** * just for test * * @param args */ public static void main(String[] args) { List<String> list = new ArrayList<String>(); list.add("sha"); list.add("lie"); list.add("bao"); /** * 方法一:最普通的不加思考的寫法 * <p> * 優勢:較常見,易於理解 * <p> * 缺點:每次都要計算list.size() */ for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); } /** * 方法二:數組長度提取出來 * <p> * 優勢:沒必要每次都計算 * <p> * 缺點:一、m的做用域不夠小,違反了最小做用域原則 二、不能在for循環中操做list的大小,好比除去或新加一個元素 */ int m = list.size(); for (int i = 0; i < m; i++) { System.out.println(list.get(i)); } /** * 方法三:數組長度提取出來 * <p> * 優勢:一、沒必要每次都計算 二、全部變量的做用域都遵循了最小範圍原則 * <p> * 缺點:一、m的做用域不夠小,違反了最小做用域原則 二、不能在for循環中操做list的大小,好比除去或新加一個元素 */ for (int i = 0, n = list.size(); i < n; i++) { System.out.println(list.get(i)); } /** * 方法四:採用倒序的寫法 * <p> * 優勢:一、沒必要每次都計算 二、全部變量的做用域都遵循了最小範圍原則 * <p> * 缺點:一、結果的順序會反 二、看起來不習慣,不易讀懂 * <p> * 適用場合:與顯示結果順序無關的地方:好比保存以前數據的校驗 */ for (int i = list.size() - 1; i >= 0; i--) { System.out.println(list.get(i)); } /** * 方法五:Iterator遍歷 * <p> * 優勢:簡潔 * <p> * 缺點: */ for (Iterator<String> it = list.iterator(); it.hasNext();) { System.out.println(it.next()); } /** * 方法六:jdk1.5新寫法 * <p> * 優勢:簡潔結合泛型使用更簡潔 * <p> * 缺點:jdk1.4向下不兼容 */ for (Object o : list) { System.out.println(o); } } } 此外不要在for循環內部聲明變量 如 bad: for(;;){ Object obj = new Object(); } good: Object obj=null; for(;;){ obj = new Object(); }