You still have to watch how many objects you create. This article looks at a benchmark passing events over TCP/IP at 4 billion events per minute using the net.openhft.chronicle.wire.channel package in Chronicle Wire and why we still avoid object allocations.. One of the key optimisations is creating almost no garbage. Allocation is a very cheap operation and collection of very short-lived objects is also very cheap. Does this really make a difference? What difference does one small object per event (44 bytes) make to the performance in a throughput test where GC pauses are amortised? While allocation is as efficient as possible, it doesn’t avoid the memory pressure on the L1/L2 caches of your CPUs and when many cores are busy, they are contending for memory in the shared L3 cache. Results Benchmark on a Ryzen 5950X with Ubuntu 22.10. JVM Vendor, Version No objects Throughput, Average Latency* One object per event Throughput, Average Latency* Azul Zulu 1.8.0_322 60.6 M event/s, 528
Thank you for the puzzle!
ReplyDeleteUnfortunately, I couldn't clearly understand the source of such behaviour. I suppose the the reason is in a way how String Constant Pool selects constants on a base of hashCode() execution. But I'm not sure.
So will wait for your solution :)
P.S. could you, please, allow comments and RSS subscription on your GitHub blog?
I read that internally String Constant Pool uses Hashtable for storing strings. So looks like equal hashCode() values isn't enough for getting puzzle effect. Also, at the first sight, external synchs on "bb" and "cC" really work on String instance wrappers not on internally char[] arrays...
DeleteSo the puzzle is really puzzle :)