Java、JIT和垃圾收集器效率

Java、JIT和垃圾收集器效率,java,garbage-collection,performance,jit,Java,Garbage Collection,Performance,Jit,我想知道Java的效率以及Java虚拟机和Android的优缺点。 效率是低内存利用率、低处理器利用率和快速执行 移动设备比PC更简单,那么应用程序需要更高效。服务器接收许多连接,它们需要非常高效。许多移动设备使用Android和Java应用程序,许多服务器使用PHP java和解释语言,如java脚本、python和php,比C++和C++ ++更有效吗? 准时制(JIT)优势: 它可以更好地优化,因为它知道一些变量的值以及在哪里使用或更改 它了解处理器,可以使用特定于处理器的指令进行优化

我想知道Java的效率以及Java虚拟机和Android的优缺点。 效率是低内存利用率、低处理器利用率和快速执行

移动设备比PC更简单,那么应用程序需要更高效。服务器接收许多连接,它们需要非常高效。许多移动设备使用Android和Java应用程序,许多服务器使用PHP

java和解释语言,如java脚本、python和php,比C++和C++ ++更有效吗? 准时制(JIT)优势:

  • 它可以更好地优化,因为它知道一些变量的值以及在哪里使用或更改
  • 它了解处理器,可以使用特定于处理器的指令进行优化
  • 将函数转换为内联函数更容易
  • 它可以删除已知的条件测试并删除不会运行的块
Java的缺点:

  • 当应用程序第一次运行时,应用程序将非常慢,因为字节码将被解释,JIT编译器将进行许多分析以找到良好的优化。应用程序无法使用最大的硬件电源。如果应用程序是游戏或实时应用程序,如果它第一次成功运行且没有延迟,但使用了最大硬件功率,那么下次运行应用程序时,由于优化,它将不会使用最大硬件功率。问题是,应用程序无法设计为在优化后使用最大硬件功率,因为它在第一次运行时速度太慢,无法继续运行
  • Java检查数组索引是否超出范围,并检查指针是否为空。它将向生成的代码添加几个内部“如果”
  • 所有对象都使用垃圾收集器,包括非常容易手动删除的对象
  • 对象的所有实例都是通过动态内存分配创建的,包括可以轻松使用堆栈的对象。如果循环迭代开始创建类的实例并结束删除创建的对象,则动态内存分配将效率低下
  • 垃圾收集器需要在清理内存时停止应用程序,这对于游戏、GUI应用程序和实时应用程序来说是非常不受欢迎的。引用计数很慢,无法处理循环引用。多线程垃圾收集器速度较慢,需要更多地使用CPU

你所说的“高效”我会称之为“理想”。换言之,一个需要很少内存、很少CPU时间、运行速度快的应用程序是一个同时又好、快、便宜的应用程序。不管它做什么有用或有趣的事

如果这三个目标都是必需的,那么我认为唯一合理的比较就是在产生共同结果的应用程序之间进行比较。在这种情况下,考虑到一组能力相当的程序员,任何一个实现都不可能在所有三个方面都优于其他实现

也就是说,你的问题遗漏了移动市场的一个关键标准:应用程序开发速度。与后端优化相比,移动应用程序从积极的用户体验中获益更多。如果没有这种限制,你所说的效率问题,在我看来,与其说是一个实际问题,不如说是一个沉重的考虑

但实际问题是:像Java这样的语言能产生比静态编译到目标机器指令集的语言更高效的代码吗?可能不会。它能同样有效,还是足够有效?绝对地如果我们考虑一个执行平台,它具有固定的、受严格限制的、很少更改的资源,那将是另一回事

java和解释语言,如java脚本、python和php,比C++和C++ ++更有效吗? 要比最好的C和C++程序更高效。有很多C和C++程序远没有那么有效,如果你有什么好的,用(现代)java代码打败它们是很实用的。 我也听说过关于当前最好的Javascript引擎的好消息,但我从未详细研究过它们

Python和PHP(以及其他许多语言)有点不同。这些语言都是用C语言编写的,所以很明显,它们的效率不可能比C语言更高(后面是构造)。然而,用它们编写高效的代码(即,使用实际上编写得非常好的C库)要比从头开始容易得多。特别是,它减少了每个程序的缺陷数量。这在实践中是一个非常重要的指标;如果允许错误,任何人都可以生成快速代码


一般来说,我建议不要担心获得最大的效率。你违反了收益递减定律。相反,使用合理的整体算法(或者,正如我的一位朋友曾经对我说的那样,“照顾好大O()并让常量因素自己照顾自己”),并关注程序在实践中是否足够好的问题。一旦它是,停止摆弄和船舶

在任何语言中,获得快速执行的方法都是以尽可能少的执行和尽可能少的垃圾收集来完成任务

这听起来像是一个空洞的概括性,但在实践中,无论使用何种语言,它的含义都是

  • 对于数据结构设计,请尽可能简单。远离充满钟声和口哨的花式收藏课程。尤其是远离通知,这是保持数据一致性的一种方式。如果您的数据是标准化的,它就永远不会不一致。如果您不能规范化它,那么最好容忍暂时的不一致性,而不是尝试使用通知来保持它的紧密性

  • 性能问题潜移默化,甚至渗透到最好的代码中。你应该试着不去做