百科问答小站 logo
百科问答小站 font logo



网上说 Java 的性能已经达到甚至超过 C++,是真的吗? 第1页

  

user avatar   liu-jin-70 网友的相关建议: 
      

游戏/CAD本来就是C++的核心阵地,特别难被其它语言取代。(科学计算/网络服务方面的强势则更多是惯性使然)在这个场景下Java和C++有明显的性能差距,不代表别的场景下两者性能不能接近。

这类场景的特点是什么呢?操作一大堆各种类型小对象的复杂代码。

  1. 大量小对象
  2. 多种类型
  3. 代码量大

缺一不可。

这类任务说到底就是模拟。Bjarne Stroustrup创造C++就是为了做模拟,并非偶然。

Memory wall是越来越高的。Memory is the new disk. 对于这类任务,不是说你JIT生成了理论上最少cycle数的代码,性能就比肩C/C++了,还要看对象的内存布局。内存布局不能和C/C++一样紧凑的话,可能从起跑线上就已经输了。

比如最简单的对象:

       struct Point {     float x;     float y;     float z; };      

C/C++的内存布局:

不可能比这更紧凑了。

再看Java(当然,与JVM具体实现相关):

多出这12 bytes可能就是内循环能不能放进L1 cache,或者对象能不能放进一个cache line的区别(后者具体到这个例子里没问题)。

Java毕竟还有primitive types。换成一些脚本语言,比如Python,每个float还有自己的header,那更没法看了。

这是一个struct。如果有嵌套的情况:

       struct Line {     struct Point begin;     struct Point end; };      

C/C++:

Java:

这就不只是多几个byte,还多了间址,有数据依赖。

再看数组:

       struct Point v[100];      

C/C++:

Java:

内存访问局部性差距比较大。

回头看前面说的3点:

  1. 大量小对象
  2. 多种类型
  3. 代码量大

如果对象都是大块连续内存,比如1MB的文本块,那么object header和间址的开销就被吸收了。

如果不是类型多和代码量大,那么你不太需要C++的抽象能力,完全可以用C。

另一方面,如果类型少,你即使用Java也可以绕过语言的类型系统自己控制布局。比如Hive根本上只有Record一种对象重要,它就可以让Record大部分时间以序列化之后的形式作为内存中的一段连续字节,回避了以上各种开销。

而如果任务同时具备以上3个特点,那么对于Java(和其它高级语言),如果不能把内循环访问的对象的内存布局优化到和C/C++基本一致,那么即使JIT再先进,性能也难以接近C/C++。

所以你看到microbenchmark里JIT表现出色的往往是Fibonacci这种只涉及int和int[]的短循环/递归。别说Java JIT了,就是Python,PyPy在这类benchmark上也表现不错。然而就此推测PyPy开发游戏引擎的表现就不太靠谱。

对于JVM来说,Project Valhalla和Azul Systems的ObjectLayout似乎都在程序员手动生成近似C/C++的内存布局上下功夫。而对于VM/JIT自动优化内存布局,是否有人做,难点在哪里,在下孤陋,

@RednaxelaFX

能否指点一二?


user avatar   yuhengk 网友的相关建议: 
      

引用 CppCon 2014 上一个我很喜欢的演讲:

Efficiency with Algorithms, Performance with Data Structures
C++ doesn't gives you performance, It gives you control over performance.

Well, 不过说真的,控制得好的代码不多……


user avatar    网友的相关建议: 
      

当感情成为生活的一种负担而且无力改变的时候。

与女生不同,大多数男生是不会把感情当作生活的全部的,过日子是头等大事,感情只是其中一部分。所以对于男生来说,一段好的感情是能让生活更轻松的。

一个男生可能会因为你漂亮而喜欢你,但这种喜欢无非是荷尔蒙冲动无法长时间维系,真正能让男生愿意和你一辈子走下去的,是你能够理解他,能够支持陪伴,能够默契相处。

但就这一点上,很多女生都是在逆行。她们所期望的感情都是建立在对于男生的索取之上,她们会因为男朋友没有足够专注自己而去作,会因为男朋友没满足自己的需要而去闹,会频繁吵架提分手来试探这个男人是否足够爱自己,却忽略了这个过程中,自己一步步在抛掉自己值得被爱的筹码。

当男生觉得和你在一起,不但体会不到丝毫乐趣,反而成为一种负担的时候,其实就已经在积累失望了。但这个时候男生一般不会直接放弃,他们会尝试逃避,会尝试沟通,会寄希望于你能逐渐去改变。

所以有经验的女生应该知道,男人的态度变化是有个周期的,不会因为你和他吵几次而一下子和你分手,但是会逐渐冷漠下来,这个过程中他就是在开始怀疑是否真的合适,会希望看到你有所变化。然而往往女生在这个阶段,又会因为男生的逃避而更加变本加厉去作去闹,想要控制对方,最终形成恶性循环。

等到失望积累够了,也就变成绝望。他会判断你已经不会变了,无药可救了,再相处下去只会让那自己越来越累,最终决定分开,等你意识到问题所在时已经来不及了,这种理性思考下的分手,往往挽回难度也是比较大的。

很多女生整天担心男生变心不爱自己,但同时却又是亲手在不断把他往外推,想想还挺可笑的。




  

相关话题

  对编程感兴趣的程序员是否都对电路、单片机也怀有浓厚的兴趣? 
  c语言有哪些图形库(非c++)? 
  这段 Java 代码中的局部变量能够被提前回收吗?编译器或 VM 能够实现如下的人工优化吗? 
  我经常看到 Java 架构师的说法,但是很少看到 C++ 架构师的说法。有哪些造成该现象的原因? 
  C++开发只能去大厂吗? 
  如何解决 C++ 代码不能打开提示有一个错误的问题? 
  为什么C++中,含有函数声明的头文件应该被包含在定义函数的源文件中? 
  如何去阅读并学习一些优秀的开源框架的源码? 
  「解释/JIT 字节码的 VM」这个概念是 Java 的设计者第一个发明的吗? 
  如何看待一些大学生说 3 天学会了 Java? 

前一个讨论
如何看待特朗普促成日本软银500亿富士康70亿美元投资美国并各自创造五万个工作岗位,共十万个在四年内?
下一个讨论
假设马克思是对的,为什么资本家不无限招工?





© 2024-05-20 - tinynew.org. All Rights Reserved.
© 2024-05-20 - tinynew.org. 保留所有权利