2012-01-31 56 views
1

簡單的實驗表明,JDK7編譯HashMap<Integer, Integer>執行簡單串行輸入查找的基準時,使用多個線程:HashMap和JDK 7

  1. 插入萬個號碼。
  2. 搜索數以百萬計的數字。

怎麼回事? JDK7自動猜測如何並行化這段代碼?我需要對單線程行爲進行基準測試,我該怎麼做?

碼,約2.5內核加載:

import java.util.*; 

public class HashSpeed { 
     public static void main(String[] args) 
     { 
       HashMap<Integer, Integer> m = new HashMap<Integer, Integer>(10000); 
       final int N = 10000000; 

       for (int i=1; i<N; i+=2) 
         m.put(i, i); 
       for (int j=0; j<10; j++) { 
         for (int i=0; i<N; i++) { 
           if (m.get(i) != null != (i%2==1)) { 
             System.out.println("failed"); 
           } 
         } 
       } 
       System.out.println("TEST OK"); 
     } 
} 
+5

請提供代碼和建議多線程的證據? – 2012-01-31 22:20:38

+0

@LouisWasserman:完成。 – Cartesius00 2012-01-31 22:25:26

+0

這不包括導致您認爲它是多線程的證據...... – 2012-01-31 22:28:59

回答

2

您是如何確認HashMap代碼實際上使用多個Java線程的?從你的描述來看,這聽起來像你在查看操作系統級別(例如Windows的任務管理器)。這可能是騙人的。 JVM可以使用多線程,例如垃圾收集等。但這並不意味着您正在運行的Java代碼正在使用多個線程。

最容易找到的最簡單的方法是看看OpenJDK source :-)。

+0

很好,可能會回答我的問題。 – Cartesius00 2012-01-31 22:33:00

0

如果你讀了OpenJDK的源代碼(它是開源的),你會發現,HashMap不能創建線程。

是什麼讓你覺得它呢?

+0

由於CPU已加載250%,您認爲它不是'HashMap',而是垃圾收集器或其他東西? – Cartesius00 2012-01-31 22:32:05