Hashmap slower after deserialization - Why?

前端 未结 2 2017
佛祖请我去吃肉
佛祖请我去吃肉 2021-01-01 03:44

I have a pretty large Hashmap (~250MB). Creating it takes about 50-55 seconds, so I decided to serialize it and save it to a file. Reading from the file takes about 16-17 se

2条回答
  •  时光取名叫无心
    2021-01-01 04:03

    This question was interesting, so I wrote my own test case to verify it. I found no difference in speed for a live lookup Vs one that was loaded from a serialized file. The program is available at the end of the post for anyone interested in running it.

    • The methods were monitored using JProfiler.
    • The serialized file is comparable to yours. ~ 230 MB.
    • Lookups in memory cost 1210 ms without any serialization

    enter image description here

    • After serializing the map and reading them again, the cost of lookups remained the same (well almost - 1224 ms)

    enter image description here

    • The profiler was tweaked to add minimal overhead in both scenarios.
    • This was measured on Java(TM) SE Runtime Environment (build 1.6.0_25-b06) / 4 CPUs running at 1.7 Ghz / 4GB Ram 800 Mhz

    Measuring is tricky. I myself noticed the 8 second lookup time that you described, but guess what else I noticed when that happened.

    GC activity

    enter image description here

    Your measurements are probably picking that up too. If you isolate the measurements of Map.get() alone you'll see that the results are comparable.


    public class GenericTest
    {
        public static void main(String... args)
        {
            // Call the methods as you please for a live Vs ser <-> de_ser run
        }
    
        private static Map generateHashMap()
        {
            Map map = new HashMap();
            final Random random = new Random();
            for(int counter = 0 ; counter < 10000000 ; counter++)
            {
                final int value = random.nextInt();
                final long key = random.nextLong();
                map.put(key, value);
            }
            return map;
        }
    
        private static void lookupItems(int n, Map map)
        {
            final Random random = new Random();
            for(int counter = 0 ; counter < n ; counter++)
            {
                final long key = random.nextLong();
                final Integer value = map.get(key);
            }
        }
    
        private static void serialize(Map map)
        {
            try
            {
                File file = new File("temp/omaha.ser");
                FileOutputStream f = new FileOutputStream(file);
                ObjectOutputStream s = new ObjectOutputStream(new BufferedOutputStream(f));
                s.writeObject(map);
                s.close();
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }
    
        private static Map deserialize()
        {
            try
            {
                File file = new File("temp/omaha.ser");
                FileInputStream f = new FileInputStream(file);
                ObjectInputStream s = new ObjectInputStream(new BufferedInputStream(f));
                HashMap map = (HashMap) s.readObject();
                s.close();
                return map;
            }
            catch (Exception e)
            {
                throw new RuntimeException(e);
            }
        }
    }
    

提交回复
热议问题