Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Hashtable vs HashMap / 9 сообщений из 9, страница 1 из 1
27.04.2006, 10:39
    #33693554
trans
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hashtable vs HashMap
Господа знатоки, возник у меня следующий вопрос. Что выгоднее использовать для более быстрого процесса Hashtable или HashMap. Я так понял, что HashMap не подвержен синхронизации и вследствии этого вроде должен быть побыстрее в общем случае. Я набросал тестик и не смог получить для HashMap большей скорости. Загрузка идет в 2 раза дольше. Поиск или примерно равен, или идет дольше.
Собственно говоря вопрос, я что-то не так делаю, или быстрота HashMap проявляется как-то по другому?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
 package  com;

 import  java.sql.*;
 import  java.util.*;

 public   class  RunTest { 

	 public   static   void  main(String[] args)  throws  Exception {

		System.out.println("#1: Fill HashMap");
		System.out.println("#2: get from HashMap");
		System.out.println("#3: Fill Hashtable");
		System.out.println("#4: get from Hashtable");

		 int  loopCount =  500000 ;
		 long  d1, d2;
		Object o;

		HashMap<String, Object> hm =  new  HashMap<String, Object>();

		d1 = System.currentTimeMillis();

		 for ( int  i =  0 ; i < loopCount; i++) {
			Integer value =  new  Integer(i);
			hm.put(value.toString(), value);
		}

		d2 = System.currentTimeMillis();

		System.out.println("step #1: " + (d2-d1));

		d1 = System.currentTimeMillis();

		 for ( int  i =  0 ; i < loopCount; i++) {
//			o = hm.get(Integer.toString(i));
			o = hm.get("777");
			o = hm.get("888");
			o = hm.get("999");
		}

		d2 = System.currentTimeMillis();

		System.out.println("step #2: " + (d2-d1));

		hm.clear();

		Hashtable<String, Object> ht =  new  Hashtable<String, Object>();
		d1 = System.currentTimeMillis();

		 for ( int  i =  0 ; i < loopCount; i++) {
			Integer value =  new  Integer(i);
			ht.put(value.toString(), value);
		}

		d2 = System.currentTimeMillis();

		System.out.println("step #3: " + (d2-d1));

		d1 = System.currentTimeMillis();

		 for ( int  i =  0 ; i < loopCount; i++) {
//			o = ht.get(Integer.toString(i));
			o = hm.get("777");
			o = hm.get("888");
			o = hm.get("999");
		}

		d2 = System.currentTimeMillis();

		System.out.println("step #4: " + (d2-d1));

		ht.clear();
		
	}
}

На выходе имеем
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
# 1 : Fill HashMap
# 2 : get from HashMap
# 3 : Fill Hashtable
# 4 : get from Hashtable
step # 1 :  2625 
step # 2 :  641 
step # 3 :  843 
step # 4 :  250 
...
Рейтинг: 0 / 0
27.04.2006, 10:51
    #33693608
wnoise
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hashtable vs HashMap
очепатка в тесте: в четвертом шаге берутся данные из Hashmap'а опять, а не из HashTable
...
Рейтинг: 0 / 0
27.04.2006, 12:48
    #33694097
OU
OU
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hashtable vs HashMap
Здесь можно общую инфо глянут:
http://java.sun.com/j2se/1.5.0/docs/api/java/util/HashMap.html

В вашем примере HashMap вы хотя и используэте generics, но вы используете Object для хранения Integer. Это будет занимть допольнительного времени на boxing и unboxing.
...
Рейтинг: 0 / 0
27.04.2006, 13:01
    #33694159
Hashtable бог?
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hashtable vs HashMap
Очеловечим слегка тест:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
 
 import  java.util.HashMap;
 import  java.util.Hashtable;
 import  java.util.IdentityHashMap;
 import  java.util.LinkedHashMap;
 import  java.util.Map;
 import  java.util.TreeMap;
 import  java.util.Collections;

 public   class  RunTest {
     public   static   final   int  LOOP_COUNT =  500000 ;

     public   static   void  main(String[] args)  throws  Exception {
         for  ( int  i =  0 ; i <  3 ; i++) {
            System.out.println("---------------------");
            testMap( new  Hashtable<String, Object>());
            testMap( new  HashMap<String, Object>());
            testMap(Collections.synchronizedMap( new  HashMap<String, Object>()));
            testMap( new  LinkedHashMap<String, Object>());
            testMap( new  TreeMap<String, Object>());
            testMap( new  IdentityHashMap<String, Object>());
        }
    }

     private   static   void  testMap(Map<String, Object> map) {
         new  FillTest().test(map);
         new  ReadTest().test(map);
        System.out.println();
    }

     abstract   static   class  Test {
         public   void  test(Map<String, Object> map) {
            String message = getTestName() + " " + map.getClass().getName() + ": ";
             long  time = System.currentTimeMillis();
            excute(map);
            System.out.println(message + (System.currentTimeMillis() - time));
        }

         protected   abstract  String getTestName();

         protected   abstract   void  excute(Map<String, Object> map);
    }

     static   class  FillTest  extends  Test {
         protected  String getTestName() {
             return  "Fill ";
        }

         protected   void  excute(Map<String, Object> map) {
             for  ( int  i =  0 ; i < LOOP_COUNT; i++) {
                 int  j = i;// % 1000;
                map.put(Integer.toString(j), j);
            }
        }
    }

     static   class  ReadTest  extends  Test {

         protected  String getTestName() {
             return  "Read ";
        }

         protected   void  excute(Map<String, Object> map) {
             for  ( int  i =  0 ; i < LOOP_COUNT; i++) {
                map.get("1");
                map.get("500");
                map.get("999");
            }
        }
    }
}

Results (int j = i;):

Fill java.util.Hashtable: 651
Read java.util.Hashtable: 140

Fill java.util.HashMap: 1573
Read java.util.HashMap: 100

Fill java.util.Collections$SynchronizedMap: 1282
Read java.util.Collections$SynchronizedMap: 120

Fill java.util.LinkedHashMap: 1642
Read java.util.LinkedHashMap: 110

Fill java.util.TreeMap: 1222
Read java.util.TreeMap: 1752

Fill java.util.IdentityHashMap: 982
Read java.util.IdentityHashMap: 130

Results (int j = i % 1000;):

Fill java.util.Hashtable: 190
Read java.util.Hashtable: 130

Fill java.util.HashMap: 140
Read java.util.HashMap: 90

Fill java.util.Collections$SynchronizedMap: 151
Read java.util.Collections$SynchronizedMap: 110

Fill java.util.LinkedHashMap: 140
Read java.util.LinkedHashMap: 100

Fill java.util.TreeMap: 260
Read java.util.TreeMap: 531

Fill java.util.IdentityHashMap: 1212
Read java.util.IdentityHashMap: 140

Забавненько...
...
Рейтинг: 0 / 0
27.04.2006, 13:12
    #33694213
trans
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hashtable vs HashMap
wnoiseочепатка в тесте: в четвертом шаге берутся данные из Hashmap'а опять, а не из HashTable
Факт! Спасибо. Видно у меня уже глаза замылились.
...
Рейтинг: 0 / 0
27.04.2006, 13:12
    #33694216
Hashtable бог?
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hashtable vs HashMap
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
fill:
            for (int i =  0 ; i < LOOP_COUNT; i++) {
                int j = i;
                map.put(Integer.toString(j), j);
            }
read:
            for (int i =  0 ; i < LOOP_COUNT; i++) {
                map.get("9");
                map.get("99");
                map.get("999");
                map.get("9999");
                map.get("99999");
                map.get("499999");
            }
result: 

Fill  java.util.Hashtable:  671 
Read  java.util.Hashtable:  321 

Fill  java.util.HashMap:  1332 
Read  java.util.HashMap:  240 

Fill  java.util.Collections$SynchronizedMap:  1272 
Read  java.util.Collections$SynchronizedMap:  280 

Fill  java.util.LinkedHashMap:  1633 
Read  java.util.LinkedHashMap:  280 

Fill  java.util.TreeMap:  1202 
Read  java.util.TreeMap:  4376 



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
fill:
            for (int i =  0 ; i < LOOP_COUNT; i++) {
                int j = i %  1000 ;
                map.put(Integer.toString(j), j);
            }
read:
            for (int i =  0 ; i < LOOP_COUNT; i++) {
                map.get("9");
                map.get("99");
                map.get("999");
                map.get("9999");
                map.get("99999");
                map.get("499999");
            }
result: 

Fill  java.util.Hashtable:  150 
Read  java.util.Hashtable:  241 

Fill  java.util.HashMap:  140 
Read  java.util.HashMap:  180 

Fill  java.util.Collections$SynchronizedMap:  221 
Read  java.util.Collections$SynchronizedMap:  240 

Fill  java.util.LinkedHashMap:  180 
Read  java.util.LinkedHashMap:  200 

Fill  java.util.TreeMap:  281 
Read  java.util.TreeMap:  1582 


Тенденция ясна...
...
Рейтинг: 0 / 0
27.04.2006, 13:19
    #33694244
trans
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hashtable vs HashMap
OUЗдесь можно общую инфо глянут:
http://java.sun.com/j2se/1.5.0/docs/api/java/util/HashMap.html

В вашем примере HashMap вы хотя и используэте generics,

Имеете ввиду, что можно поиграться с capacity?

OU
но вы используете Object для хранения Integer. Это будет занимть допольнительного времени на boxing и unboxing.
Попробовал. Особобого выигрыша не заметил.
Но в общем случае согласен, что чем больше явной типизации в Яве, тем лучше.
...
Рейтинг: 0 / 0
27.04.2006, 13:39
    #33694345
OU
OU
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hashtable vs HashMap
2 trans:
Можно конечно ради интереса.
В принципе тест Hashtable бог все расставляет на места.
...
Рейтинг: 0 / 0
27.04.2006, 14:10
    #33694502
trans
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hashtable vs HashMap
OU2 trans:
Можно конечно ради интереса.
В принципе тест Hashtable бог все расставляет на места.
Угу. Я изначально не правильно составил тест. После закачки данных, я в цикле выбирал каждое значение. В этом случае Hashtable почему-то выдает более хороший результат. Если дергать отдельные значения, HashMap явный фаворит.
Но для дерганья каждого значения есть другие классы. Так что, надо было изначально строить тест на отдельных значениях.

Спасибо всем откликнувшимся.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Hashtable vs HashMap / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]