/* * Copyright (C) ${year} Omry Yadan <${email}> * All rights reserved. * * See https://github.com/omry/banana/blob/master/BSD-LICENSE for licensing information */ package net.yadan.banana.map; import net.yadan.banana.DebugLevel; import net.yadan.banana.memory.Buffer; import net.yadan.banana.memory.IBuffer; import net.yadan.banana.memory.IMemAllocator; import net.yadan.banana.memory.initializers.NullInitializer; import net.yadan.banana.memory.malloc.MultiSizeAllocator; import net.yadan.banana.memory.malloc.TreeAllocator; import net.yadan.utils.StringUtil; import java.lang.management.ManagementFactory; import java.lang.management.MemoryMXBean; import java.lang.management.MemoryUsage; import java.util.Arrays; import java.util.Collection; import java.util.HashMap; public class Benchmark { private int m_num; public Benchmark(int num) { m_num = num; } public static Collection<Object[]> data() { //@formatter:off Object[][] data = new Object[][] { {2}, // {1000}, // {10000}, // {100000}, // {1000000}, // {6500000}, // {10000000}, // {50000000}, // {100000000}, }; return Arrays.asList(data); } //@formatter:on public void testBananaVarKeyHash() { NullInitializer nullInitializer = new NullInitializer(); IMemAllocator values = new TreeAllocator(100, VarKeyHashMap.RESERVED_SIZE + 2, 1.2); IMemAllocator keys = new MultiSizeAllocator(100, new int[] { 2, 3, 5, 6 }, 1.2); values.setInitializer(nullInitializer); keys.setInitializer(nullInitializer); IVarKeyHashMap h = new VarKeyHashMap(values, keys, m_num, 1.0); h.setDebug(DebugLevel.DEBUG_STRUCTURE); IBuffer key = new Buffer(10); for (int i = 1; i < m_num; i++) { setAsString(key, i); int n = h.createRecord(key, 2); h.setLong(n, 0, i); key.reset(); } for (int i = 0; i < m_num; i++) { // setAsString(key, i); key.appendChars((key + "_" + i).toCharArray()); int n = h.findRecord(key); long v = h.getLong(n, 0); if (i != v) throw new RuntimeException("failed"); key.reset(); } System.gc(); System.out.println(h.size()); MemoryMXBean mx = ManagementFactory.getMemoryMXBean(); MemoryUsage usage = mx.getHeapMemoryUsage(); System.out.println("Memory used by banana varkey hashmap : " + usage.getUsed()); System.out.println("Reported memory by banana varkey hashmap : " + h.computeMemoryUsage()); } char chars[] = new char[33]; private void setAsString(IBuffer key, int val) { int length = StringUtil.toChars(val, chars); key.appendChars(chars, 0, length); } public void testJava() { HashMap<String, Long> h = new HashMap<String, Long>(m_num, 1.0f); for (int i = 0; i < m_num; i++) { h.put(String.valueOf(i), new Long(i)); } for (int i = 0; i < m_num; i++) { long v = h.get(String.valueOf(i)); if (i != v) throw new RuntimeException("failed"); } System.gc(); System.out.println(h.size()); MemoryMXBean mx = ManagementFactory.getMemoryMXBean(); MemoryUsage usage = mx.getHeapMemoryUsage(); System.out.println("Memory used by java hashmap : " + usage.getUsed()); } public static void main(String[] args) throws Throwable { Collection<Object[]> data = data(); for (Object o[] : data) { Integer size = (Integer) o[0]; Benchmark b = new Benchmark(size); b.testBoth(size); } } private void testBoth(int size) { long t; t = System.currentTimeMillis(); testJava(); System.out.println(String.format("Java (%d items) : %d ms", size, (System.currentTimeMillis() - t))); System.gc(); t = System.currentTimeMillis(); testBananaVarKeyHash(); System.out.println(String.format("banana varkey hash (%d items) : %d ms", size, (System.currentTimeMillis() - t))); System.gc(); } }