Skip to content

Why is Hashmap in Java much faster than Dictionary in .NET? #38660

@Dogwei

Description

@Dogwei

Description

10 times faster on 1000 elements.

5 times faster on 1000000 elements.

Configuration

.NET Core 3.1 on release

Java 12 on nodebug

Java

	public static void main(String[] args) {

		Random random = random = new Random();

		while (true) {

			int count = 1000000;
			
            int times = 10;

			int existsStart = random.nextInt(count);
			int notExistsStart = existsStart + count;

			String[] exists = getStrings(existsStart, existsStart + count);
			String[] notExists = getStrings(notExistsStart, notExistsStart + count);
			HashMap<String, String> map = new HashMap();

			long begin = System.currentTimeMillis();

			for (int i = 0; i < exists.length; i++) {
				String item = exists[i];
				map.put(item, item);
			}

			System.out.println("add:" + (System.currentTimeMillis() - begin));

			begin = System.currentTimeMillis();

			
            for (int t = 0; t < times; t++){
				for (int i = 0; i < exists.length; i++) {
					String item = exists[i];
					map.containsKey(item);
				}
			}

			System.out.println("exists:" + (System.currentTimeMillis() - begin));

			begin = System.currentTimeMillis();

            for (int t = 0; t < times; t++){
				for (int i = 0; i < notExists.length; i++) {
					String item = notExists[i];
					map.containsKey(item);
				}
			}

			System.out.println("not exists:" + (System.currentTimeMillis() - begin));

			begin = System.currentTimeMillis();

			for (int i = 0; i < exists.length; i++) {
				String item = exists[i];
				map.remove(item);
			}

			System.out.println("remove:" + (System.currentTimeMillis() - begin));

			System.out.println("=====================end======================");
		}
	}

	public static String[] getStrings(int start, int end) {
		int length = end - start;

		String[] ret = new String[length];

		for (int i = 0; i < length; i++) {
			ret[i] = "0x" + Integer.toString(start + i, 16);
		}

		return ret;
	}

C#

        var random = new Random();



        while (true)
        {
            int count = 1000000;

            int times = 10;

            var existsStart = random.Next(count);
            var notExistsStart = existsStart + count;

            var exists = Enumerable.Range(existsStart, existsStart + count).Select(i => $"0x{Convert.ToString(i, 16)}").ToArray();
            var notExists = Enumerable.Range(notExistsStart, notExistsStart + count).Select(i => $"0x{Convert.ToString(i, 16)}").ToArray();

            var dic = new Dictionary<string, object>();

            var stopwatch = Stopwatch.StartNew();

            for (int i = 0; i < exists.Length; i++)
            {
                var item = exists[i];
                dic.Add(item, item);
            }

            Console.WriteLine("add:" + stopwatch.ElapsedMilliseconds);

            stopwatch = Stopwatch.StartNew();

            for (int t = 0; t < times; t++)
            {
                for (int i = 0; i < exists.Length; i++)
                {
                    var item = exists[i];
                    dic.ContainsKey(item);
                }
            }

            Console.WriteLine("exists:" + stopwatch.ElapsedMilliseconds);

            stopwatch = Stopwatch.StartNew();

            for (int t = 0; t < times; t++)
            {
                for (int i = 0; i < notExists.Length; i++)
                {
                    var item = notExists[i];
                    dic.ContainsKey(item);
                }
            }

            Console.WriteLine("not exists:" + stopwatch.ElapsedMilliseconds);

            stopwatch = Stopwatch.StartNew();

            for (int i = 0; i < exists.Length; i++)
            {
                var item = exists[i];
                dic.Remove(item);
            }

            Console.WriteLine("remove:" + stopwatch.ElapsedMilliseconds);

            Console.WriteLine("=====================end======================");
        }

Analysis

Is it possible that Java use more extreme tiered compilation optimization?

Metadata

Metadata

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions