2017-05-31 124 views
-3

這是我的java數據,如果數據量巨大,處理和獲取響應需要很多時間如何優化此代碼以獲取快速動作兩個for循環花費大量時間執行任何解決方案以減少時間JAVA

List<EventLog> eventLogs = new ArrayList<EventLog>(); 
List<EventLog> eventLogData = get(currentUser, data); 
Map<String, Integer> map = new HashMap<String, Integer>(); 

for (EventLog rep : eventLogData) { 
    if (map.containsKey(rep.getEventType())) { 
    map.put(rep.getEventType(), map.get(rep.getEventType()) + 1); 
    } else { 
    map.put(rep.getEventType(), 1); 
    } 
} 

for (Map.Entry<String, Integer> entry : map.entrySet()) { 
    EventLog list = new EventLog(); 
    list.setEventType(entry.getKey()); 
    list.setCount(entry.getValue()); 
    eventLogs.add(list); 
} 

return eventLogs; 
+5

「巨​​大」和「長時間」不是很具體。請詳細說明。 – OldProgrammer

+0

兩者都以線性時間運行(只有一個深度),除非您更詳細地指定了期望的結果以及迴路太慢的方式,否則可能無法做任何事情。 – luk2302

+1

你是否分析了你的應用程序?你確定這是執行時間很長的代碼塊嗎?你確定這個塊會從優化中受益嗎? – scottb

回答

-6

在這樣你就可以使用,而不是foreach一個環修改代碼中使用list.size()獲取列表的大小:

for(int a=0, b=5 ; a<=5 ; a++,b--){ 
    // do your stuff here 
} 
+5

你甚至可以理解問題中的代碼在做什麼嗎?它正在與櫃檯進行分組。 – Andreas

+0

@Muhammad Waqas你可以更新你的代碼在我的代碼先生我使用mongodb作爲後端 –

+0

你的代碼在哪裏 –

0

你有沒有考慮使用其他高性能的集合庫?
這是我的實現,使用Trove庫。它提供了自

  1. 地圖更快的執行是更新,需要在原執行一個單一的接入(adjustOrPutValue),而不是兩個(containsKey方法和獲取)
  2. 它處理原始INT的,而不是整數的,避免了所有拳擊和拆箱操作,並消耗更少的內存

List<EventLog> eventLogData = get(currentUser, data); 
TObjectIntMap<String> map = new TObjectIntHashMap<>(); 

for (EventLog rep : eventLogData) { 
    map.adjustOrPutValue(rep.getEventType(), 1, 1); 
} 

List<EventLog> eventLogs = new ArrayList<>(); 
map.forEachEntry(new TObjectIntProcedure<String>() { 
    @Override 
    public boolean execute(String key, int value) { 
     EventLog list = new EventLog(); 
     list.setEventType(key); 
     list.setCount(value); 
     eventLogs.add(list); 
     return true; 
    } 
}); 

return eventLogs;