C# →  Dictionary против Hashtable.

Тест скорости работы класса Dictionary и класса Hashtable.

Искал класс для хранения данных и нашел пару подходящих. На первый взгляд различие в них было только в названии, мне стало интересно в чем же между ними разница и я провел небольшой тест скорости работы того и другого.

Суть теста:

Пройдемся for-ом по каждому из классов поочередно, сначала записывая, затем читая, и напоследок удаляя значения из списков.
Замерять скорость выполнения циклов будем с помощью класса Stopwatch.

Код:
using System;
using System.Collections.Generic;
using System.Collections;
using System.Diagnostics;

namespace DictionaryVsHashtable
{
    class Program
    {
        static void Main(string[] args)
        {
            Hashtable hashtable = new Hashtable();
            Dictionary<object, object> dictionary = new Dictionary<object, object>();
            int hash_int, dict_int;
            Stopwatch stopwatch = new Stopwatch();
            #region HashTableTest
            // Записываем
            stopwatch.Start();
            for (int i = 0; i<=100000; i++)
            {
                hashtable.Add(i, i);
            }
            stopwatch.Stop();
            Console.WriteLine("Запись в Hashtable заняла: " + stopwatch.ElapsedMilliseconds+" миллисекунд.");
            stopwatch.Reset();
            // Читаем
            stopwatch.Start();
            for (int i = 0; i <= 100000; i++)
            {
                hash_int = (int)hashtable[i];
            }
            stopwatch.Stop();
            Console.WriteLine("Чтение из Hashtable заняло: " + stopwatch.ElapsedMilliseconds + " миллисекунд.");
            stopwatch.Reset();
            // Удаляем
            stopwatch.Start();
            for (int i = 0; i <= 100000; i++)
            {
                hashtable.Remove(i);
            }
            stopwatch.Stop();
            Console.WriteLine("Удалиние из Hashtable заняло: " + stopwatch.ElapsedMilliseconds + " миллисекунд.");
            stopwatch.Reset();
            #endregion

            #region DictionaryTest
            // Записываем
            stopwatch.Start();
            for (int i = 0; i <= 100000; i++)
            {
                dictionary.Add(i, i);
            }
            stopwatch.Stop();
            Console.WriteLine("Запись в Dictionary заняла: " + stopwatch.ElapsedMilliseconds + " миллисекунд.");
            stopwatch.Reset();
            // Читаем
            stopwatch.Start();
            for (int i = 0; i <= 100000; i++)
            {
                dict_int = (int)dictionary[i];
            }
            stopwatch.Stop();
            Console.WriteLine("Чтение из Dictionary заняло: " + stopwatch.ElapsedMilliseconds + " миллисекунд.");
            stopwatch.Reset();
            // Удаляем
            stopwatch.Start();
            for (int i = 0; i <= 100000; i++)
            {
                dictionary.Remove(i);
            }
            stopwatch.Stop();
            Console.WriteLine("Удалиние из Dictionary заняло: " + stopwatch.ElapsedMilliseconds + " миллисекунд.");
            stopwatch.Reset();
            #endregion
        }
    }
}


Результат:



ДействиеHashtableDictionary
Запись
9 мс
25 мс
Чтение
8 мс
4 мс
Удаление
5 мс
4 мс


Но т.к. ключ (key) значений (values) у меня будет фиксированным, я изменил следующую строку:
Dictionary<object, object> dictionary = new Dictionary<object, object>();

на:
Dictionary<int, object> dictionary = new Dictionary<int, object>();


Теперь результат выглядит так:



ДействиеHashtableDictionary
Запись
9 мс
13 мс
Чтение
8 мс
2 мс
Удаление
5 мс
2 мс


Если еще и значения буду фиксированными, то Dictionary будет работать еще быстрее.

Мой выбор — Dictionary.
  • +1
  • 16 июля 2009, 16:20
  • Frozzeg

Комментарии (0)

RSS свернуть / развернуть

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.