Just an update for those who may be interested.

With some improvements to the Java side, and using a more realistic test of 1 
pub and 1 sub, the results:

Java:
without SSL, 3450k msgs per sec
with SSL, 1300k msgs per sec

Go:
without SSL, 3600k msgs per sec
with SSL, 1800k msgs per sec

Clearly using software based SSL offers superior performance in Go.

Also, in order to improve the Java throughput numbers, the latency numbers 
degraded as expected, falling to:

latency avg 198522 min 170305 max 962827

with Go being:

latency avg 187347 min 157705 max 604295

The intermediary queue that was added to the Java version (in order to increase 
parallism and avoid some contention), shows an advantage of the Go 
async+routine model. The Go scheduler (which was already subject to the OS 
scheduler latency - which remains effectively constant as more Go routines are 
added), can improve as more “queues/channels” are added, where a similar design 
in a thread based model improves the concurrency but increases the latency due 
to more OS context switching.

As discussed I may do a last round using Java NIO to implement a similar async 
model - the difference is these complexities are handled internally by Go, and 
with Java you need to handle them yourself (or use a well written library) - 
but even then the “code design is different” - where as in Go it remains the 
same procedural handling you started with.

The closest way (and maybe simplest) is to probably to use a Java “fibers” 
library for light-weight threads, but that’s not standard Java either.

> On Oct 30, 2018, at 3:46 PM, robert engels <reng...@ix.netcom.com> wrote:
> 
> Btw, the math was off here, with 3 million vs. 5 million ops a second (and 
> these are essentially IO ops - sending messages to the broker), the 
> difference is 0.13 microsecs per op - or 130 nanos. Pretty insignificant for 
> IO based tasks.
> 
>> On Oct 30, 2018, at 8:10 AM, Robert Engels <reng...@ix.netcom.com> wrote:
>> 
>> I’ve written lots of network service code. I understand what’s available. 
>> Actually, for a small number of clients threads are faster than async/nio. 
>> In this case there is only a single active thread during the test. 
>> 
>> The main benefit of using nio is that you can avoid the java space to native 
>> copying by using a direct byte buffer. This would make things considerably 
>> faster, and put less pressure on the garbage collector. But to do this you 
>> need to use channels, and these are a pain with SSL - not impossible but 
>> certainly not trivial.
>> 
>> I plan on reworking so of the code to use a buffer chain - which is what the 
>> Go version does. 
>> 
>> One thing to keep in mind, at 3-5 million operations a second, the 
>> difference is under 2 microsecs an op. With the GC pauses in Go being half 
>> that of Java, it doesn’t take too many pauses to account speed difference. 
>> 
>> 
>>> On Oct 30, 2018, at 7:17 AM, gerrit.jansen_van_vuu...@datastax.com wrote:
>>> 
>>> Some notes on your java impl:
>>> 
>>> You really want to use a framework for handling the connections and 
>>> threading, its tricky in java.
>>> Your current implementation creates 2 new threads on each connection which 
>>> is wasteful and very expensive.
>>> 
>>> For threading please see:
>>> https://stackoverflow.com/questions/5483047/why-is-creating-a-thread-said-to-be-expensive
>>> 
>>> You would either use:
>>> https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Executors.html
>>> or
>>> go for https://netty.io/.
>>> 
>>> For TLS
>>> 
>>> Java's implementation is unfortunately slow :(. 
>>> (https://nbsoftsolutions.com/blog/the-cost-of-tls-in-java-and-solutions)
>>> The solution is to either use something like HAproxy or try and use native 
>>> ssl libraries, https://netty.io/wiki/forked-tomcat-native.html.
>>> 
>>> For a fairer comparison please do a rerun with the latest jre 11 and the 
>>> threads being created in a global Executor service
>>> 
>>> 
>>> -- 
>>> 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.
>>> For more options, visit https://groups.google.com/d/optout.
> 

-- 
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.
For more options, visit https://groups.google.com/d/optout.

Reply via email to