3 ms·
Aren't the versions that take 10% of the time only reading each city name once, and then doing an array lookup rather than a hashmap lookup?
by antonhag 2y ago
Aren't the versions that take 10% of the time only reading each city name once, and then doing an array lookup rather than a hashmap lookup?
- marginalia_nu 2y agoNope, see for example "Custom 1": var buffer = ByteBuffer.allocate(4096); try (var fc = (FileChannel) Files.newByteChannel(tempFile, StandardOpenOption.READ)) { buffer.flip(); for (int i = 0; i < records; i++) { if (buffer.remaining() < 32) { buffer.compact(); fc.read(buffer); buffer.flip(); } int len = buffer.get(); byte[] cityBytes = new byte[len]; buffer.get(cityBytes); String city = new String(cityBytes); int temperature = buffer.getShort(); stats.computeIfAbsent(city, k -> new ResultsObserver()) .observe(temperature / 100.); } }
- antonhag 2y agoMy bad - I got confused as the original DIS+BIS took ~60s on my machine. I reproducing the Custom 1 implementation locally (before seeing your repo) and it took ~48s on the same machine. JFR (which you honestly can trust most of the time) says that the HashMap lookup now is ~50% of the time and the String constructor call being ~35%.