By the way, see the following quote and this page 
https://www.bytonic.de/html/benchmarks.html 
<https://www.bytonic.de/html/benchmarks.html> and this quote,

"
November 28, 2005. Retrieved July 18, 2009. This is a great show of 3D prowess. 
Things like this, as well as the Narya 2D open source engine from ThreeRings 
really are starting to at least show Java can serve as a first-class gaming 
platform. More than that, just having seen all the… *cough* horrible code in 
games before, having things like Java’s threading model, network and database 
support might really make it a BETTER platform for a lot of forthcoming games 
than C.



When the Jake2 Java based Quake engine was released, it was just as fast at the 
C version and far easier to develop in.

Btw, I have also published gaming software, a long, long time ago… The 
algorithm matters more than the platform, but it needs to match the platform. 
You can trust the JIT to perform better code optimization than most 
developers...


> On Sep 12, 2018, at 8:34 AM, robert engels <reng...@ix.netcom.com> wrote:
> 
> While I always appreciate a good presentation, a little color might be in 
> order to get me to watch a 1.5 hr presentation.
> 
> I’ll disagree on ByteBuffer. The prime motivation for ByteBuffer was to 
> abstract the concept of a memory buffer (usually bytes). The primary reason 
> is that byte[] has a defined meaning in the Java system, and to do NIO with 
> direct memory (or have off-heap memory to avoid GC) they needed an 
> abstraction layer - so you could implement DirectByteBuffer. Nothing to do 
> with generics. Then with this specialized class, the VM can use intrinsics to 
> make ByteBuffer perform as well as Java memory, or native memory.
> 
> Go doesn’t need this, since the byte[] in Go is already a native pointer.
> 
>> On Sep 12, 2018, at 8:15 AM, Egon <egonel...@gmail.com 
>> <mailto:egonel...@gmail.com>> wrote:
>> 
>> On Wednesday, 12 September 2018 15:47:14 UTC+3, Robert Engels wrote:
>> I am well aware of mechanical sympathy and the techniques (like the 
>> disrupter) used (I would counter that in many cases you are not writing 
>> “Java” due to the object pooling ,etc.)
>> 
>> What I’ve shown is that Java is already more performant than Go without 
>> using those techniques for many application aspects - specifically in terms 
>> of method dispatch, but still Go direct methods vs interface methods are 5x 
>> faster, so you if you need ultra performance critical code you need to keep 
>> that in mind, but RARELY is this the case (except for some people in HFT but 
>> even they have moved on to FPGAs) and you are far better structuring your 
>> code for maintainability and functionality rather than worrying about slower 
>> method dispatch...
>> 
>> https://www.youtube.com/watch?v=rX0ItVEVjHc 
>> <https://www.youtube.com/watch?v=rX0ItVEVjHc>
>>  
>> 
>> ArrayList<byte> is not “correct” Java - because you are going to encode 
>> every byte as an object in an object[] behind the scenes, and each would 
>> need to be managed as an Object. Java has arrays, you would simply use a 
>> byte[]. If you need expandable arrays, you would probably use a ByteBuffer.
>> 
>> That is exactly the boxing overhead that the generics dilemma talks about. 
>> ByteBuffer is an example where the generics weren't good enough and people 
>> ended up manually implemented a specialized version.
>> 
>> Remember you shouldn't be comparing performance of Java generics vs Go 
>> status quo... you should be comparing Java generics vs C++ generics vs Swift 
>> generics vs D generics vs Zig generics. That way the trade-offs of different 
>> approaches becomes visible.
>>  
>> 
>> Your point highlights an important consideration - most people don’t know 
>> how to write REALLY performant software in a given language unless it is an 
>> area of focus and experience, which is why I distribute the tests publicly 
>> because I will grant that there may be techniques in Go that I am not 
>> understanding or misusing - but at this point I think I have a pretty good 
>> handle on the internal workings of Go.
>> 
>> I completely agree that most people can live with the current state.
>>  
>> 
>> The biggest performance advantage for Go will be the garbage collector due 
>> to the “value type” of array struct, since there is only a single reference 
>> to be GC managed regardless of the number of elements. That is not possible 
>> in Java - at least not now. That being said, there are Java VMs like Azul 
>> Zing that are far more performant than Go in terms of GC pauses without any 
>> restricting on the layout of the memory being managed. As soon as you start 
>> using array of interface in Go, you are going to put pressure on the GC, as 
>> the number of references that need to be managed expands proportional to the 
>> size of the array - at least I think so - but there may be behind the scenes 
>> escape analysis that determines if any references escape the array, and if 
>> not it can still manage it is a single reference.
>> 
>> But all of this is off-topic from the original post - which was to suggest 
>> to keep it simple and use interfaces/closures at runtime to support generics 
>> and not worrying about the performance overhead - the really performance 
>> critical coders can always write non-generic/interface containers if they 
>> absolutely think they need it, but most likely they don’t...
>> 
>> I tend to agree, but having specializing generics makes some of that code 
>> easier to manage.
>>  
>>  
>> 
>>> On Sep 11, 2018, at 11:57 PM, Egon <egon...@ <>gmail.com 
>>> <http://gmail.com/>> wrote:
>>> 
>>> 
>>> 
>>> On Tuesday, 11 September 2018 18:28:29 UTC+3, Robert Engels wrote:
>>> 
>>>> On Sep 11, 2018, at 9:55 AM, 'Axel Wagner' via golang-nuts <golan...@ 
>>>> <>googlegroups.com <http://googlegroups.com/>> wrote:
>>>> 
>>>> [golang-nuts to CC, golang-dev to BCC]
>>>> 
>>>> On Mon, Sep 10, 2018 at 5:33 PM robert engels <ren...@ <>ix.netcom.com 
>>>> <http://ix.netcom.com/>> wrote:
>>>> In the entire codebase of Docker I could find only one obvious use of 
>>>> interface{}, and no type casts.
>>>> 
>>>> Generics are not only useful for functions taking interface{}. They are 
>>>> also useful for functions taking non-empty interfaces, for cases where you 
>>>> could re-use an existing generic implementation and forego re-implementing 
>>>> it for your concrete type and for reducing boilerplate across many types 
>>>> (e.g. the famous sort.Interface).
>>> 
>>> True, and reviewing cockroachdb shows the sort.Interface used a lot, and a 
>>> generic container could avoid that, but in most cases this could be solved 
>>> by only having to implement Less and having ’sort’ work on slices - as the 
>>> vast majority are slices to begin with.
>>> 
>>> I am just attempting to point out that the original Go designers offered 
>>> ’typed’ collections (slice, map) as part of the language. They fall short 
>>> in some ways but it may be possible for a simpler solution to expand their 
>>> abilities, or add others, without resorting to generics. I like the 
>>> simplicity and readability “no surprises for the most part” of Go, and I 
>>> think it should try to stay that way.
>>> 
>>>> 
>>>> In my opinion, Go isn’t suitable for large enterprise systems with 
>>>> million+ lines of code
>>>> 
>>>> No offense, but empirically, the existence of such systems written in Go 
>>>> seems to contradict you here. Kubernetes has 3.5M lines of code in just 
>>>> the single main repository. And that's just open source software - most of 
>>>> the actual million+ lines of code systems written in Go you won't know 
>>>> about, because they are not open (I work on one of those).
>>> 
>>> This seems to contradict this a bit, 
>>> https://stackoverflow.com/questions/41586501/why-is-kubernetes-source-code-an-order-of-magnitude-larger-than-other-container
>>>  
>>> <https://stackoverflow.com/questions/41586501/why-is-kubernetes-source-code-an-order-of-magnitude-larger-than-other-container>
>>>  but it may be an indictment that Go’s lack of classes/inheritance/generics 
>>> leads to code bloat. I believe that you work on a large Go system, I am 
>>> just not positive it is pleasurable to maintain/refactor - maybe for high 
>>> knowledge original authors - but as I said I am going to leave that 
>>> criticism to another post, as it is not particular germane to the generics 
>>> discussion.
>>> 
>>>> 
>>>> The Java generic code is a pleasure to use, and maintain
>>>> 
>>>> I believe this is up to individual perception. Personally, I found working 
>>>> on a large-scale Java codebase to be an unpleasant experience, because of 
>>>> the generic code.
>>> 
>>> I would be curious as to what the stumbling block was.  I’ve seen 
>>> Tuple<Long,Long> used in public APIs in some code bases - where a typed 
>>> class that wraps it is for more appropriate - not good, and very poor 
>>> maintainability.
>>> 
>>>> 
>>>> But, people cry, boxing is SLOW, and we want Go to be FAST! This paper 
>>>> https://research.swtch.com/generic <https://research.swtch.com/generic> is 
>>>> citied multiple times as a charge against boxing.
>>>> 
>>>> Not quite. That article is cited to clarify that you need to decide on 
>>>> what tradeoff you want to make and to justify it. Boxing - choosing "slow 
>>>> programs" in the parlance of the article - is a reasonable choice to make, 
>>>> but you should do so deliberately and make a good case for why it's the 
>>>> right choice.
>>>> 
>>>> It's also used as a reference to quickly explain one example of the 
>>>> current design, which is that it makes that decision no longer a language 
>>>> decision, but an implementation decision. i.e. we don't even know if 
>>>> generics in Go will be boxed or not - we can decide that later and change 
>>>> the decision at will.
>>>> 
>>> 
>>> I disagree with your reading here. The statement from the article is "do 
>>> you want slow programmers, slow compilers and bloated binaries, or slow 
>>> execution times?” 
>>> 
>>> and as I pointed out, Go’s method dispatch is already slower than Java in 
>>> both the direct and interface cases. So citing Java and ‘slow execution 
>>> times’ as a problem with generics s incorrect by the author, and that 
>>> people keep citing it as fact is troublesome. People have proposed 
>>> interface based generics for Go, and the criticism is most of the time - 
>>> that will be slower...
>>> 
>>> 
>>> I think you haven't seen what people need to do in Java to make it 
>>> performant. As an example:
>>> 
>>> https://mechanical-sympathy.blogspot.com/2012/10/compact-off-heap-structurestuples-in.html
>>>  
>>> <https://mechanical-sympathy.blogspot.com/2012/10/compact-off-heap-structurestuples-in.html>
>>> 
>>> That example is more about value types, but also implicitly a problem with 
>>> boxing.
>>> 
>>> The boxing overhead is most visible with having things like ArrayList<byte>.
>>> 
>>> Indeed there are places where Java can erase some of the performance 
>>> overhead, even more so with GraalVM. (Not sure about the memory overhead)
>>> 
>>> 
>>>> Now the reason for this is almost certainly that Java can inline across 
>>>> virtual function calls
>>>> 
>>>> I would say that the core advantage of Java is likely that it is 
>>>> JIT-compiled and as such can do a whole bunch of optimizations that an 
>>>> AOT-compiled language like Go can't do. But I might be wrong.
>>>> 
>>>> I also don't think it matters a lot. I think it's more important what 
>>>> works for Go, than what worked for Java. The two languages are very 
>>>> different in both semantics and implementation. Conclusions from one don't 
>>>> necessarily transfer to the other.
>>>> 
>>> 
>>> Exactly, Go is very simple, and ideal for the cases I pointed out in the 
>>> original post (and I’ll add, micro-services too), and so far all of the 
>>> proposals that seem to be gaining traction don’t continue that design 
>>> paradigm. 
>>> 
>>>> -- 
>>>> 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 <http://googlegroups.com/>.
>>>> For more options, visit https://groups.google.com/d/optout 
>>>> <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...@googlegroups.com <>.
>>> For more options, visit https://groups.google.com/d/optout 
>>> <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 
>> <mailto:golang-nuts+unsubscr...@googlegroups.com>.
>> For more options, visit https://groups.google.com/d/optout 
>> <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 
> <mailto:golang-nuts+unsubscr...@googlegroups.com>.
> For more options, visit https://groups.google.com/d/optout 
> <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