In termini di design del linguaggio, non c'è davvero nulla che dovrebbe rendere Go più lento di Java in generale. In effetti, ti dà un maggiore controllo del layout di memoria delle tue strutture dati, quindi per molte attività comuni dovrebbe essere un po 'più veloce. Tuttavia, l'attuale compilatore Go principale, lo scheduler, il garbage collector, la libreria regexp e molte altre cose non sono particolarmente ottimizzati. Questo è in costante miglioramento, ma l'obiettivo sembra essere utile, semplice e abbastanza veloce rispetto alla vittoria nei microbenchmark.
Nel benchmark collegato, Go perde molto su Java sull'albero binario e sul test regexp. Quelli sono test del sistema di gestione della memoria e della libreria regexp rispettivamente. La gestione della memoria di Go potrebbe essere più veloce e certamente migliorerà nel tempo e l'attuale libreria regexp standard è un segnaposto per un'implementazione molto migliore che verrà presto. Quindi, perdere su quei due non è sorprendente, e nel prossimo futuro il margine dovrebbe essere più stretto.
Per il benchmark k-nucleotide, è in qualche modo difficile confrontare perché il codice Java sembra utilizzare un algoritmo diverso. Il codice Go trarrà sicuramente beneficio dai miglioramenti del compilatore, dello scheduler e dell'allocatore, anche se scritti, ma qualcuno dovrebbe riscrivere il codice Go per fare qualcosa di più intelligente se volessimo confrontare in modo più accurato.
Java vince nel benchmark mandelbrot perché è tutto aritmetica e loop in virgola mobile, e questo è un ottimo posto per la JVM per generare codice macchina davvero buono e sollevare le cose in fase di esecuzione. Go, in confronto, ha un compilatore piuttosto semplice che attualmente non solleva, srotola o genera codice macchina molto stretto, quindi non sorprende che perda. Tuttavia, si dovrebbe tenere presente che il timing Java non conta il tempo di avvio di JVM o le molte volte che deve essere eseguito affinché JVM lo esegua correttamente. Per i programmi di lunga durata, questo non è rilevante, ma in alcuni casi è importante.
Per quanto riguarda il resto dei benchmark, Java e Go sono sostanzialmente testa a testa, con Go che occupa molta meno memoria e nella maggior parte dei casi meno codice. Quindi, sebbene Go sia più lento di Java in alcuni di questi test, Java è piuttosto veloce, Go fa abbastanza bene in confronto e Go probabilmente diventerà notevolmente più veloce nel prossimo futuro.
Non vedo l'ora di quando gccgo (un compilatore Go che usa il codegen gcc) è maturo; ciò dovrebbe rendere Go praticamente in linea con C per molti tipi di codice, il che sarà interessante.