Java真的很慢吗?

2023-11-29

Java有在某种程度上因缓慢而闻名.

  • Java真的很慢吗?
  • 如果是,为什么?瓶颈在(或曾经)在哪里?是因为 JVM 效率低下吗?垃圾收集?纯字节码库而不是 JNI 包装的 C 代码?许多其他语言都具有这些功能,但它们没有缓慢的声誉。

现代 Java 是最快的语言之一,尽管它仍然占用内存。爪哇had因其速度慢而闻名,因为过去虚拟机启动需要很长时间。

如果你仍然认为 Java 很慢, see 基准游戏结果。用提前编译语言(C、Fortran 等)编写的经过严格优化的代码可以击败它;然而,Java 的速度可以比 PHP、Ruby、Python 等快 10 倍以上。在某些特定领域,Java 可以击败常见的编译语言(如果它们使用标准库)。

现在,Java 应用程序“慢”是没有任何借口的。开发人员和遗留代码/库应该受到指责,而不仅仅是语言。另外,归咎于任何“企业”。

公平地说,对于那些“Java 很慢”的人来说,以下是它仍然很慢的领域(2013 年更新):

  • 库通常是为了“正确性”和可读性而编写的,而不是为了性能。在我看来,这是Java仍然名声不佳的主要原因,尤其是服务器端。这使得字符串问题呈指数级恶化。一些简单的错误很常见:经常使用对象代替基元,从而降低性能并增加内存使用。许多 Java 库(包括标准库)会频繁创建字符串,而不是重用可变或更简单的格式(char[] 或 StringBuffer)。这很慢并且会产生大量垃圾供以后收集。为了解决这个问题,我建议开发人员尽可能使用原始集合,尤其是 Javalution 的库。

  • 字符串操作有点慢。Java使用不可变,UTF-16- 编码的字符串对象。这意味着您需要更多内存、更多内存访问,并且某些操作比 ASCII(C、C++)更复杂。当时,正是right决定可移植性,但它会带来很小的性能成本。UTF-8现在看起来是一个更好的选择。

  • 与 C 相比,数组访问要慢一些,由于边界检查。惩罚曾经很大,但现在很小(Java 7 优化掉了很多冗余的边界检查)。

  • 缺乏任意内存访问可能会使某些 I/O 和位级处理变慢(例如压缩/解压缩)。这是现在大多数高级语言的安全特性。

  • Java 使用的内存比 C 多得多,如果您的应用程序受内存限制或内存带宽限制(缓存等),这会使其速度变慢。另一方面是分配/释放速度非常快(高度优化)。这是现在大多数高级语言的一个特性,并且由于对象和使用GC而不是显式的内存分配。再加上图书馆的糟糕决定。

  • 基于流的 I/O 速度很慢由于(IMO,糟糕的选择)要求每个流访问同步。NIO修复了这个问题,但是使用起来很痛苦。人们可以通过对数组而不是一次对一个元素进行读/写来解决这个问题。

  • Java 不提供与 C 相同的低级功能,所以你不能使用脏的内联汇编技巧来使某些操作更快。这提供了可移植性,并且是现在大多数高级语言的一个特性。

  • Java 应用程序与非常旧的 JVM 版本相关的情况很常见。尤其是服务器端。与最新版本相比,这些旧 JVM 的效率可能极其低下。

最后,Java 的设计目的是为了提供安全性和可移植性,但牺牲了一些性能,并且对于它所显示的一些真正要求很高的操作来说。它大部分缓慢的声誉已不再名副其实。


然而,有几个地方需要Javafaster与大多数其他语言相比:

  • 内存分配和解除分配 又快又便宜。我见过案例 速度快 20%(或更多!) 分配一个新的多kB数组 重用缓存的一个。

  • 对象实例化和面向对象的功能使用起来非常快(在某些情况下比 C++ 更快),因为它们是从一开始就设计的。这部分来自于良好的 GC,而不是显式分配(这对大量小对象分配更友好)。人们可以编写 C 代码来击败这一点(通过滚动自定义内存管理并有效地执行 malloc),但这并不容易。

  • 方法调用基本上是免费的,并且在某些情况下比大型方法代码更快。 The HotSpot编译器使用执行信息来优化方法调用,并具有非常高效的内联。通过使用额外的执行信息,它有时可以胜过提前编译器,甚至(在极少数情况下)手动内联。与 C/C++ 相比,如果编译器决定不内联,方法调用会带来较小的性能损失。

  • 同步和多线程既简单又高效。Java 从一开始就被设计为具有线程感知能力,这一点也得到了证明。现代计算机通常具有多个核心,并且由于线程内置于该语言中,因此您可以很容易地利用它。与标准单线程 C 代码相比,速度基本上提高了 100% 到 300%。是的,精心编写的 C 线程和库可以克服这个问题,但这对程序员来说是很多额外的工作。

  • 字符串包括长度:某些操作速度更快。这优于使用空分隔字符串(C 中常见)。在 Java 7 中,Oracle 取消了 String.subString() 优化,因为人们愚蠢地使用它并导致内存泄漏。

  • 数组复制经过高度优化。在最新版本中,Java 对 System.arraycopy 使用手动调整的汇编程序。结果是,在 arraycopy/memcopy 密集型操作中,我发现我的代码以合理的幅度击败了 C 中的等效代码。

  • JIT 编译器很聪明地使用L1/L2 cache。提前编译的程序无法根据其运行的特定 CPU 和系统实时调整其代码。 JIT 通过这种方式提供了一些非常有效的循环转换。

其他一些历史事实也导致了“Java 很慢”的声誉:

  • 在 JIT 编译(Java 1.2/1.3)之前,该语言仅被解释,而不被编译,因此非常慢。
  • JIT 编译需要时间才能变得高效(每个版本都有重大改进)
  • 多年来,类加载已经变得更加高效。过去它在启动过程中效率很低且缓慢。
  • Swing并且 UI 代码没有很好地使用本机图形硬件。
  • 摇摆实在是太糟糕了。我将 Java 从未在桌面上流行起来的原因归咎于 AWT 和 Swing。
  • 在库类中大量使用同步;现已提供非同步版本
  • 小程序需要很长时间才能加载,因为要传输完整的内容JAR通过网络并加载虚拟机进行启动。
  • 同步过去会带来严重的性能损失(每个 Java 版本都对此进行了优化)。不过,反思的代价仍然很高。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java真的很慢吗? 的相关文章

  • 如何使用 Java 和 Selenium WebDriver 在 C 目录中创建文件夹并需要将屏幕截图保存在该目录中?

    目前正在与硒网络驱动程序和代码Java 我有一种情况 我需要在 C 目录中创建一个文件夹 并在该文件夹中创建我通过 selenium Web 驱动程序代码拍摄的屏幕截图 它需要存储在带有时间戳的文件夹中 如果我每天按计划运行脚本 所有屏幕截
  • 在 HTTPResponse Android 中跟踪重定向

    我需要遵循 HTTPost 给我的重定向 当我发出 HTTP post 并尝试读取响应时 我得到重定向页面 html 我怎样才能解决这个问题 代码 public void parseDoc final HttpParams params n
  • 无法展开 RemoteViews - 错误通知

    最近 我收到越来越多的用户收到 RemoteServiceException 错误的报告 我每次给出的堆栈跟踪如下 android app RemoteServiceException Bad notification posted fro
  • Spring Data JPA 应用排序、分页以及 where 子句

    我目前正在使用 Spring JPA 并利用此处所述的排序和分页 如何通过Spring data JPA通过排序和可分页查询数据 https stackoverflow com questions 10527124 how to query
  • 磁模拟

    假设我在 n m 像素的 2D 表面上有 p 个节点 我希望这些节点相互吸引 使得它们相距越远吸引力就越强 但是 如果两个节点之间的距离 比如 d A B 小于某个阈值 比如 k 那么它们就会开始排斥 谁能让我开始编写一些关于如何随时间更新
  • Draggable JS Bootstrap 模式 - 性能问题

    对于工作中的项目 我们在 JavaScript 中使用 Bootstrap Modal 窗口 我们想让一些窗口可移动 但我们遇到了 JQuery 的性能问题 myModal draggable handle modal header Exa
  • Spring @RequestMapping 带有可选参数

    我的控制器在请求映射中存在可选参数的问题 请查看下面的控制器 GetMapping produces MediaType APPLICATION JSON VALUE public ResponseEntity
  • 斯坦福 NLP - 处理文件列表时 OpenIE 内存不足

    我正在尝试使用斯坦福 CoreNLP 中的 OpenIE 工具从多个文件中提取信息 当多个文件 而不是一个 传递到输入时 它会给出内存不足错误 All files have been queued awaiting termination
  • 从 127.0.0.1 到 2130706433,然后再返回

    使用标准 Java 库 从 IPV4 地址的点分字符串表示形式获取的最快方法是什么 127 0 0 1 到等效的整数表示 2130706433 相应地 反转所述操作的最快方法是什么 从整数开始2130706433到字符串表示形式 127 0
  • Java按日期升序对列表对象进行排序[重复]

    这个问题在这里已经有答案了 我想按一个参数对对象列表进行排序 其日期格式为 YYYY MM DD HH mm 按升序排列 我找不到正确的解决方案 在 python 中使用 lambda 很容易对其进行排序 但在 Java 中我遇到了问题 f
  • 如何在 javadoc 中使用“<”和“>”而不进行格式化?

    如果我写
  • Eclipse Java 远程调试器通过 VPN 速度极慢

    我有时被迫离开办公室工作 这意味着我需要通过 VPN 进入我的实验室 我注意到在这种情况下使用 Eclipse 进行远程调试速度非常慢 速度慢到调试器需要 5 7 分钟才能连接到远程 jvm 连接后 每次单步执行断点 行可能需要 20 30
  • Google App Engine 如何预编译 Java?

    App Engine 对应用程序的 Java 字节码使用 预编译 过程 以增强应用程序在 Java 运行时环境中的性能 预编译代码的功能与原始字节码相同 有没有详细的信息这是做什么的 我在一个中找到了这个谷歌群组消息 http groups
  • Android 中麦克风的后台访问

    是否可以通过 Android 手机上的后台应用程序 服务 持续监控麦克风 我想做的一些想法 不断聆听背景中的声音信号 收到 有趣的 音频信号后 执行一些网络操作 如果前台应用程序需要的话 后台应用程序必须能够智能地放弃对麦克风的访问 除非可
  • Java列表的线程安全

    我有一个列表 它将在线程安全上下文或非线程安全上下文中使用 究竟会是哪一个 无法提前确定 在这种特殊情况下 每当列表进入非线程安全上下文时 我都会使用它来包装它 Collections synchronizedList 但如果不进入非线程安
  • 玩!框架:运行“h2-browser”可以运行,但网页不可用

    当我运行命令时activator h2 browser它会使用以下 url 打开浏览器 192 168 1 17 8082 但我得到 使用 Chrome 此网页无法使用 奇怪的是它以前确实有效 从那时起我唯一改变的是JAVA OPTS以启用
  • simpleframework,将空元素反序列化为空字符串而不是 null

    我使用简单框架 http simple sourceforge net http simple sourceforge net 在一个项目中满足我的序列化 反序列化需求 但在处理空 空字符串值时它不能按预期工作 好吧 至少不是我所期望的 如
  • JGit 检查分支是否已签出

    我正在使用 JGit 开发一个项目 我设法删除了一个分支 但我还想检查该分支是否已签出 我发现了一个变量CheckoutCommand但它是私有的 private boolean isCheckoutIndex return startCo
  • 按日期对 RecyclerView 进行排序

    我正在尝试按日期对 RecyclerView 进行排序 但我尝试了太多的事情 我不知道现在该尝试什么 问题就出在这条线上适配器 notifyDataSetChanged 因为如果我不放 不会显示错误 但也不会更新 recyclerview
  • 如何实现仅当可用内存较低时才将数据交换到磁盘的写缓存

    我想将应用程序生成的数据缓存在内存中 但如果内存变得稀缺 我想将数据交换到磁盘 理想情况下 我希望虚拟机通知它需要内存并将我的数据写入磁盘并以这种方式释放一些内存 但我没有看到任何方法以通知我的方式将自己挂接到虚拟机中before an O

随机推荐

  • 需要 Handlebars.js 来渲染对象数据而不是“[Object object]”

    我正在使用 Handlebars 模板 并且 JSON 数据已在 Object object 中表示 如何在 Handlebars 之外解析此数据 例如 我尝试通过句柄标签填充页面上的 JavaScript 变量 但这不起作用 有什么建议么
  • 如何以编程方式将 WPF TreeView 绑定到 List

    因此 我对 WPF 非常陌生 并尝试将 Drink 值列表绑定或分配给 wpf 树视图 但不知道如何执行此操作 并且发现很难在网上找到任何不使用 xaml 只显示内容的内容 struct Drink public string Name g
  • PHP Oauth 签名_无效

    我无法理解为什么这不起作用 我真的认为它应该是这样 请帮忙 这是我得到的错误 signature invalid base string GET https 3A 2F 2Fwww google com 2Faccounts 2FOAuth
  • 无法在 R 中初始化 CoreNLP

    我无法访问coreNLP在运行 High Sierra 的 Mac 上用 R 编写 我不确定问题是什么 但似乎每次我再次尝试获取coreNLP工作时 我面临着不同的错误 我有 JDK 9 0 4 请参阅下面的代码 了解我正在尝试执行的操作以
  • CLR 存储过程中的多线程代码?

    多线程 CLR 存储过程可能吗 我有一项数据密集型任务 具有很大的并行化潜力 CLR 存储过程非常适合消除将数据移出进程的开销 但我担心我必须放弃并行计算 我有什么选择 注意 我们使用的是 SQL Server 2005 计划在 4 个月内
  • 如何将 UIView、UIImageView 或 CALayer 动画旋转 360°?

    你如何旋转UIView UIImageView or CALayer不使用 OpenGL ES 进行 360 度动画 import
  • ASP.NET 和 STA COM 对象

    想要在这里解决争论 我读过的关于使用 VB 中从 ASP NET 页面创建的 COM 对象的所有内容都围绕着 警告 请确保安装了 ASPCOMPAT 否则它将无法工作 然而 我已经设置好了 你猜怎么着 没问题 现在 我读到了这个 http
  • PHP 和 XML。使用 PHP 循环 XML 文件

    我现在正陷入 foreach 炼狱中 试图想出一种用 PHP 遵循 XML 文件内容 遍历这个 XML 文件 下面的实际 XML 文本 的方法 我想做的是 获取所有文件夹元素名称 如果文件夹元素的子文件夹属性为 yes 则向下移动一级并获取
  • 在 Google Compute Engine 上从没有公共 IP 的计算机路由到互联网

    在 Google Compute Engine 上 我们有没有公共 IP 的机器 因为配额限制了可以拥有公共 IP 地址的机器数量 我们需要这些非公共 IP 机器来访问 Google 存储桶中的数据 这似乎意味着我们必须路由到互联网 但我们
  • 使用 ImageMagick 对图像进行平等测试

    ImageMagick 库中有相等谓词函数吗 我想比较两个图像并找出它们是否完全相同 像素的所有颜色都相同 或有任何差异 我查了一下 好像没有这个功能 我应该自己使用像素迭代器编写函数吗 ImageMagick 提供compare功能来正确
  • 如何在不同的目录中启动 npm?

    我通常cd进入app目录然后运行npm start 我的感觉应该是有什么办法可以跑npm start带有路径参数 但是 npm 启动文档不包含这样的功能 我尝试自己却发现npm start myapp不起作用 有没有办法做到这一点 这一行应
  • 如何在 Angular 8 中将下拉列表(带选项)从 JSON 导出到 Excel?

    我正在尝试将 JSON 数据导出到具有下拉列表的 Excel 如果我们将数组作为单元格值传递 是否可以在 Excel 中创建下拉菜单 带选项 我正在尝试使用内置库 XLSX 来实现此目的 但如果我在单元格值中传递数组 则无法查看数据 更新
  • 如何知道一个StorageFolder-obj属于SD还是Phone?

    有没有办法知道 StorageFolder obj 属于 SD 或 WP8 1 上的手机 感谢您 例如 您可以通过检查Path of StorageFolder or StorageFIle string folderPath yourSt
  • 如何在jsPDF生成的PDF中添加水印?

    我正在从canva 生成PDF 并使用jsPDF 生成它 https github com MrRio jsPDF 这是我正在使用的代码 我想将水印添加到页面中 有人能帮我吗 self downloadCanvasObjectAsPDF f
  • 导入错误:没有名为 requests 的模块

    我知道有很多关于此的帖子 并且我尝试使用提供的解决方案 但无济于事 我试过pip install requests and pip install requests upgrade pip install requests upgrade
  • 没有标签的“for”属性的自定义复选框(Bootstrap 4)

    有没有办法仍然保留 Bootstrap 4 自定义复选框样式不使用 the id关于输入和属性for标签上 当您删除它时 检查的样式不存在 Example div class custom control custom checkbox m
  • 使用 jQuery 以像素为单位的填充或边距值作为整数

    jQuery 具有 height 和 width 函数 它们以整数形式返回像素的高度或宽度 如何获取元素的填充或边距值以像素和整数为单位使用 jQuery 我的第一个想法是执行以下操作 var padding parseInt jQuery
  • 需要帮助将格式 20120130 的日期转换为日期数据类型 oracle sql

    您能帮我将日期从 20120101 格式转换为 Orcle Sql 中的 DATE 格式吗 我看了这个link但它没有提到日期格式是否是自定义的 编辑 是否可以将任何排除规则写入转换函数 像这样的 99999999 到 9999 12 31
  • Firefox 浏览器不会重新加载更新的 CSS/JS 文件

    我在 Firefox 浏览器中遇到问题 因为每次更新 CSS 或 JS 文件时 我都需要清除 Firefox 浏览器的缓存才能获取更新的文件 我使用 XSP2 服务器是因为我在 ubuntu 中使用 C 和 asp net 开发了我的 we
  • Java真的很慢吗?

    Locked 这个问题及其答案是locked因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动 Java有在某种程度上因缓慢而闻名 Java真的很慢吗 如果是 为什么 瓶颈在 或曾经 在哪里 是因为 JVM 效率低下吗 垃圾收