Hi all,

I had a opportunity to change the Java version to use memory mapped files, 
using GraalVM:

insert time 10000000 records = 15443ms, usec per op 1.5443
close time 4954ms
scan time 1934ms, usec per op 0.1934
scan time 50% 81ms, usec per op 0.162
random access time 6.264us per get
close with merge 1 time 0ms
scan time 2077ms, usec per op 0.2077
scan time 50% 67ms, usec per op 0.134
random access time 6.083us per get

The Java version is now more than 7x faster than Go in most sequential reads, 
and 33% faster in random.

If I find the time I will add memory mapped files to the Go version as well.

I offer these metrics to illustrate that usually the IO algorithm is going to 
affect performance more than micro differences in JVM/Go/Native binaries with 
modern development platforms.

> On Dec 26, 2020, at 5:23 PM, robert engels <reng...@ix.netcom.com> wrote:
> 
> Ask and ye shall receive…
> 
> So, first with running using the GraalVM JDK 11 Community Edition:
> 
> insert time 10000000 records = 19305ms, usec per op 1.9305
> close time 12313ms
> scan time 10695ms, usec per op 1.0695
> scan time 50% 461ms, usec per op 0.922
> random access time 12.014us per get
> close with merge 1 time 0ms
> scan time 9685ms, usec per op 0.9685
> scan time 50% 456ms, usec per op 0.912
> random access time 11.986us per get
> 
> then I created the statically compiled binary:
> 
> insert time 10000000 records = 33182ms, usec per op 3.3182
> close time 23602ms
> scan time 15104ms, usec per op 1.5104
> scan time 50% 670ms, usec per op 1.34
> random access time 23.85us per get
> close with merge 1 time 0ms
> scan time 15093ms, usec per op 1.5093
> scan time 50% 705ms, usec per op 1.41
> random access time 24.271us per get
> 
> oops, not so good. So then I downloaded the enterprise versions and created a 
> profile guided optimized static binary:
> 
> insert time 10000000 records = 21705ms, usec per op 2.1705
> close time 13792ms
> scan time 10415ms, usec per op 1.0415
> scan time 50% 479ms, usec per op 0.958
> random access time 13.582us per get
> close with merge 1 time 0ms
> scan time 10391ms, usec per op 1.0391
> scan time 50% 479ms, usec per op 0.958
> random access time 13.557us per get
> 
> The binary size of the last is 8.5 MB. For comparison, the Go binary is 3MB.
> 
> 
> 
> 
>> On Dec 22, 2020, at 10:55 AM, flying_dutchman <younisas...@gmail.com 
>> <mailto:younisas...@gmail.com>> wrote:
>> 
>> I think it'd be a good idea if you can compile your Java port using GraalVM 
>> and benchmark the generated executable.
>> 
>> On Monday, December 14, 2020 at 2:58:15 AM UTC+5:30 ren...@ix.netcom.com 
>> <http://ix.netcom.com/> wrote:
>> I did not, and honestly it is probably not a great comparison.
>> 
>> Java requires the JVM - which is separate - so executables sizes are hard to 
>> compare. The Java ‘executable code’ is tiny.
>> 
>> As for runtime memory usage, it is fairly trivial since the data is stored 
>> on disk with an in-memory ’skip index’. The skip index is nearly identical 
>> between the two - Java probably having a bit more pointer overhead - but the 
>> size of the in-memory index is configurable - so trading memory for speed is 
>> up to the user.
>> 
>> There is no way to cap the heap size in Go to offer an apples-2-apples 
>> comparison.
>> 
>> 
>> 
>> 
>> 
>>> On Dec 13, 2020, at 3:08 PM, da...@suarezhouse.net 
>>> <http://suarezhouse.net/> <da...@suarezhouse.net 
>>> <applewebdata://D7D7E2AB-953E-4E8E-A2FB-9F05F31FAC82>> wrote:
>>> 
>> 
>>> Super interesting.  Did you happen to catch the runtime memory avg, median, 
>>> max and current "executable" file size difference?
>>> 
>>> On Saturday, December 12, 2020 at 1:04:42 PM UTC-6 ren...@ix.netcom.com 
>>> <http://ix.netcom.com/> wrote:
>>> Hi all,
>>> 
>>> I thought this might be of interest to some. I released a Java version of 
>>> keydb <https://github.com/robaho/keydb> at jkeydb 
>>> <https://github.com/robaho/jkeydb>. I primarily did the exercise to keep my 
>>> Java skills fresh and do an updated performance comparison between Go and 
>>> Java.
>>> 
>>> Tests performed using OSX Big Sur.
>>> 
>>> Using Go 1.15.5:
>>> 
>>> insert time  10000000 records =  24670 ms, usec per op  2.4670965
>>> close time  16945 ms
>>> scan time  10631 ms, usec per op  1.063149
>>> scan time 50%  470 ms, usec per op  0.941686
>>> random access time  9.658001 us per get
>>> close with merge 1 time  0.681 ms
>>> scan time  11253 ms, usec per op  1.1253718
>>> scan time 50%  471 ms, usec per op  0.942876
>>> random access time  9.702651 us per get
>>> 
>>> Using Java 1.15:
>>> 
>>> insert time 10000000 records = 24102ms, usec per op 2.4102
>>> close time 13564ms
>>> scan time 10259ms, usec per op 1.0259
>>> scan time 50% 474ms, usec per op 0.948
>>> random access time 13.209us per get
>>> close with merge 1 time 0ms
>>> scan time 10142ms, usec per op 1.0142
>>> scan time 50% 501ms, usec per op 1.002
>>> random access time 13.28us per get
>>> 
>>> Performance is very similar, except that Go is significantly faster in the 
>>> random access tests. I attribute this to the JNI overhead in making lots of 
>>> small IO requests. In a previous life I wrote some custom JNI code for 
>>> ultrafast IO and I might resurrect that to see if it makes a difference.
>>> 
>>> You can vary the ‘keyIndexInterval’ to trade memory for speed which 
>>> significantly helps the Java version by reducing the IO.
>>> 
>>> There are significantly fewer source (non test) code files in the Go 
>>> version, 10 vs. 26 which highlights the simplicity of Go.
>>> 
>>> Anyway, feel free to ask any questions if you wish.
>>> 
>>> 
>>> 
>> 
>>> -- 
>>> You received this message because you are subscribed to the Google Groups 
>>> "golang-nuts" group.
>>> To unsubscribe from this group and stop receiving emails from it, send an 
>>> email to golang-nuts...@googlegroups.com 
>>> <applewebdata://D7D7E2AB-953E-4E8E-A2FB-9F05F31FAC82>.
>> 
>>> To view this discussion on the web visit 
>>> https://groups.google.com/d/msgid/golang-nuts/9079e608-2c6c-4547-8c27-ebbb48a2fe61n%40googlegroups.com
>>>  
>>> <https://groups.google.com/d/msgid/golang-nuts/9079e608-2c6c-4547-8c27-ebbb48a2fe61n%40googlegroups.com?utm_medium=email&utm_source=footer>.
>> 
>> 
>> -- 
>> You received this message because you are subscribed to the Google Groups 
>> "golang-nuts" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to golang-nuts+unsubscr...@googlegroups.com 
>> <mailto:golang-nuts+unsubscr...@googlegroups.com>.
>> To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/golang-nuts/37374167-c575-407f-971b-78f2b1c3131bn%40googlegroups.com
>>  
>> <https://groups.google.com/d/msgid/golang-nuts/37374167-c575-407f-971b-78f2b1c3131bn%40googlegroups.com?utm_medium=email&utm_source=footer>.

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/B53A1F2E-CC35-4879-8A7C-BA333FBFB3FE%40ix.netcom.com.

Reply via email to