谁能量化 C++ 和 Java 之间的性能差异?

2024-02-29

在 JIT 出现之前,Java 最初速度很慢,但现在的性能非常接近 C++。我想知道是否有人对这两种语言进行了可衡量的性能比较?与C++相比,Java的不足在哪里?Java 为开发人员提供了许多生产力提升,因此他们可以更快地编写应用程序,因为没有垃圾学院、缺乏指针等。例如,如果使用 100 编写,则可以更快、更可靠地开发诸如 Firefox、Webkit 和 Open Office 之类的应用程序% Java,可能是 2 倍,但出于性能原因,开发人员仍然选择 C/C++。有人可以演示一下,对于我提到的应用程序来说,Java 在哪些方面不能像 C++ 一样执行。

让我补充一点,许多应用程序工作仍在 C++ 中完成是有原因的。这不仅仅是一个主观问题。具有较高抽象级别的语言经常会付出性能损失。如果不存在这种惩罚,我们都会使用高级语言进行编程。与 C++ 相比,Java 的优势在哪里?请明确点。


语言没有速度。 Java 或 C++ 语言规范均未指定“并且程序必须编译为this高效的”。

每种语言都指定了程序必须执行的操作列表,或者至少,似乎做,在某些情况下,它对程序的效率设定了上限,但通常,聪明的编译器可以忽略单个程序中的这些规则,因为最重要的是程序的行为as if已遵循规范。函数可以内联,堆数据可以移动到堆栈等等。

程序的性能取决于三个因素:编译器、底层平台/硬件以及程序代码本身。

不是“语言”。你得到的最接近的是编译器。

任何一种语言都比另一种语言更快是有充分理由的。 C++ 做出的承诺较少,可能会减慢程序执行速度,但 Java 是 JIT 化的,这意味着它可能会利用运行时信息来优化代码,而 C++ 无法轻易做到这一点……但话又说回来,Java 中无处可寻。规范是否规定 C++ 必须not被jit'ed。就像我相信也有 Java 编译器生成本机代码而不是 JVM 字节码。

仅当您拥有正在运行的特定计算机、每种语言的特定编译器以及每种语言的程序的特定实现时,您的问题才有意义,在这种情况下,你可以运行两者来看看哪个最快.

垃圾收集是另一个很好的例子。当然,垃圾收集意味着一些开销,但它也提供了一些重要的捷径。在 Java 或 .NET 等托管语言中,堆分配非常便宜,because它受到管理和垃圾收集。在 C++ 中,它......当然是未指定的,但实际上,通常非常慢,因为操作系统必须遍历堆以在或多或少碎片化的内存空间中找到空闲内存块。哪个最快?取决于操作系统。取决于编译器。取决于源代码。

源代码也有很大的不同。如果你将一个 Java 程序天真地移植到 C++,它的性能会很糟糕。 C++ 不能很好地处理虚函数,并且通常有更好的替代方案供您使用。在 C++ 中,堆分配可能非常慢,因此,简单地重新实现 Java 程序效率极低。朝相反方向行驶时也是如此。如果直接移植到 Java,许多 C++ 习惯用法会不必要地变慢。因此,即使您已经选择了一种平台和一种编译器,您如何比较程序的性能呢?甚至为了将它交给编译器,您必须编写它的两个实现,然后它就不再是同一个程序。

然而,我认为可以公平地说,在大多数现代硬件上,使用现代 Java 编译器和现代 C++ 编译器,大多数程序都可以非常高效地实现,而且肯定足够快。但前提是您了解所使用的语言并遵守其规则。如果您尝试用 C++ 编写 Java 代码,那么 Java 将神奇地变得更加高效,反之亦然。

我想对你的问题最简洁的回答是“不。没有人可以量化 C++ 和 Java 之间的性能差异”;)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

谁能量化 C++ 和 Java 之间的性能差异? 的相关文章

  • C - 找到极限之间的所有友好数字

    首先是定义 一对友好的数字由两个不同的整数组成 其中 第一个整数的除数之和等于第二个整数 并且 第二个整数的除数之和等于第一个整数 完美数是等于其自身约数之和的数 我想做的是制作一个程序 询问用户一个下限和一个上限 然后向他 她提供这两个限
  • 将目录压缩为单个文件的方法有哪些

    不知道怎么问 所以我会解释一下情况 我需要存储一些压缩文件 最初的想法是创建一个文件夹并存储所需数量的压缩文件 并创建一个文件来保存有关每个压缩文件的数据 但是 我不被允许创建许多文件 只能有一个 我决定创建一个压缩文件 其中包含有关进一步
  • C 预处理器库

    我的任务是开发源分析工具C程序 并且我需要在分析本身之前预处理代码 我想知道什么是最好的图书馆 我需要一些重量轻 便于携带的东西 与其推出自己的 为什么不使用cpp这是的一部分gcc suite http gcc gnu org onlin
  • Json.NET - 反序列化接口属性引发错误“类型是接口或抽象类,无法实例化”

    我有一个类 其属性是接口 public class Foo public int Number get set public ISomething Thing get set 尝试反序列化Foo使用 Json NET 的类给我一条错误消息
  • Qt moc 在头文件中实现?

    是否可以告诉 Qt MOC 我想声明该类并在单个文件中实现它 而不是将它们拆分为 h 和 cpp 文件 如果要在 cpp 文件中声明并实现 QObject 子类 则必须手动包含 moc 文件 例如 文件main cpp struct Sub
  • 指针减法混乱

    当我们从另一个指针中减去一个指针时 差值不等于它们相距多少字节 而是等于它们相距多少个整数 如果指向整数 为什么这样 这个想法是你指向内存块 06 07 08 09 10 11 mem 18 24 17 53 7 14 data 如果你有i
  • JavaFX - 为什么多次将节点添加到窗格或不同的窗格会导致错误?

    我现在正在学习基本的 JavaFX 我不明白我正在阅读的书中的这一说法 不 诸如文本字段之类的节点只能添加到一个窗格中一次 将节点添加到多次窗格或不同的窗格将导致运行时错误 我可以从书中提供的UML图看出它是一个组合 但我不明白为什么 库类
  • 将自定义元数据添加到 jpeg 文件

    我正在开发一个图像处理项目 C 我需要在处理完成后将自定义元数据写入 jpeg 文件 我怎样才能做到这一点 有没有可用的图书馆可以做到这一点 如果您正在谈论 EXIF 元数据 您可能需要查看exiv2 http www exiv2 org
  • Java中的回调接口是什么?

    SetObserver 接口的代码片段取自有效的Java 避免过度同步第67条 public interface SetObserver
  • Java:由 HTTP 连接创建的等待连接线程存活时间很长

    我有一个服务器端代码 用于检查 SOAP 服务是否已启动 代码如下 String response while response length 0 try final URL url new URL DummySoapServiceURL
  • 将 xml 反序列化为类,list<> 出现问题

    我有以下 XML
  • 失败时石英重试

    假设我有一个这样配置的触发器
  • NHibernate - CreateCriteria 与 CreateAlias

    假设以下场景 class Project public Job Job class Job public Name 假设我想使用 Criteria API 搜索其 Job 名称为 sumthing 的所有项目 我可以使用 CreateAli
  • 为什么 C# Math.Ceiling 向下舍入?

    我今天过得很艰难 但有些事情不太对劲 在我的 C 代码中 我有这样的内容 Math Ceiling decimal this TotalRecordCount this PageSize Where int TotalRecordCount
  • const、span 和迭代器的问题

    我尝试编写一个按索引迭代容器的迭代器 AIt and a const It两者都允许更改容器的内容 AConst it and a const Const it两者都禁止更改容器的内容 之后 我尝试写一个span
  • Validation.ErrorTemplate 的 Wpf 动态资源查找

    在我的 App xaml 中 我定义了一个资源Validation ErrorTemplate 这取决于动态BorderBrush资源 我打算定义独特的BorderBrush在我拥有的每个窗口以及窗口内的不同块内
  • x86 上未对齐的指针

    有人可以提供一个示例 将指针从一种类型转换为另一种类型由于未对齐而失败吗 在评论中这个答案 https stackoverflow com questions 544928 reading integer size bytes from a
  • 如何使用 std::string 将所有出现的一个字符替换为两个字符?

    有没有一种简单的方法来替换所有出现的 in a std string with 转义 a 中的所有斜杠std string 完成此操作的最简单方法可能是boost字符串算法库 http www boost org doc libs 1 46
  • ASP.NET MVC 6 (ASP.NET 5) 中的 Application_PreSendRequestHeaders 和 Application_BeginRequest

    如何在 ASP NET 5 MVC6 中使用这些方法 在 MVC5 中 我在 Global asax 中使用了它 现在呢 也许是入门班 protected void Application PreSendRequestHeaders obj
  • 限制C#中的并行线程数

    我正在编写一个 C 程序来生成并通过 FTP 上传 50 万个文件 我想并行处理4个文件 因为机器有4个核心 文件生成需要更长的时间 是否可以将以下 Powershell 示例转换为 C 或者是否有更好的框架 例如 C 中的 Actor 框

随机推荐

  • 在 didEndEditing 中更改 UITextField 边框样式

    我想在用户编辑 uitextfield 时突出显示它 因此我将文本字段的 borderstyle 默认设置为 UITextBorderStyleNone 并使用 uitextfields 委托 如下所示 void textFieldDidB
  • JS 解构。如何处理空值或未定义值

    如何实现 Nullable 特性es6 questions tagged es6 我需要支持我以前同事的源代码 他使用了太多的解构功能es6 questions tagged es6 到处都是这样的 dispatch loadImports
  • 使用 NSPredicate 比较 2 个数组 (cocoa)

    我有一个带有 2 个属性的 NSObject interface Entity NSObject NSNumber nid NSString title 我有 2 个数组 其中包含实体的对象 我想将 nid 上的这两个数组与谓词进行比较 a
  • Windows窗体中,对象出现在其他项目的前面?

    当我将氪项目添加到我的表单中时 它们出现在其他项目的上方 我该如何制作才能将一些东西放在其他项目后面 假设您使用的是 Winform 设计器 您可以右键单击控件并从上下文菜单中选择 置于前面 或 发送到后面 来更改控件的 z 顺序
  • 如何使用通配符 ip 0.0.0.0 获取 InetAddress?

    InetAddress不提供任何静态方法或构造函数来获取InetAddress使用通配符 IP 0 0 0 0 唯一的办法是InetAddress getByName 0 0 0 0 但 PMD 给出AvoidUsingHardCodedI
  • 如何将用户重定向到IdentityServer4中的注册页面?

    我已经基于以下实现了应用程序安全性快速入门第6步 使用ASP NET Core Identity http docs identityserver io en release quickstarts 6 aspnet identity ht
  • 在 C 中将 Char 数组转换为 Long

    这个问题可能看起来很傻 但请指导我 我有一个将长数据转换为字符数组的函数 void ConvertLongToChar char pSrc char pDest pDest 0 pSrc 0 pDest 1 pSrc 1 pDest 2 p
  • 创建目录。如果存在,则删除目录及其内容并用 Java 创建新目录

    我正在尝试用 Java 创建一个目录 如果存在 我想删除该目录及其内容并创建一个新目录 我正在尝试执行以下操作 但该目录未删除 新文件将附加到目录中 File file new File path boolean isDirectoryCr
  • 如何在android中读取USSD消息? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在开发一个安卓应用程序 我基本上想将 USSD 响应读入应用程序 有没有API可以做到这一点 如何将
  • Argparse:将父解析器与子解析器混合

    我想写一个简单的工具任意数量的输入文件并执行one对他们每个人进行操作 语法非常简单 mytool operation input1 input2 inputN 其中一些操作可能需要额外的参数 mytool operation op arg
  • 从 github 构建 R 包:如何禁用构建小插图?

    我尝试建立R 包的分支 https github com patcpsc rredis来自github 这个fork有一个新的错误修复 https github com bwlewis doRedis issues 10 不幸的是 在尝试构
  • 在测试期间注入@Autowired私有字段

    我有一个组件设置 本质上是应用程序的启动器 它的配置如下 Component public class MyLauncher Autowired MyService myService other methods MyService 注释为
  • 在编译时获取 std::array 中的元素数量

    以下是有效的 C 代码吗 为什么不呢 std array
  • Go 语法和接口作为函数的参数

    我是Go编程语言的新手 最近遇到以下代码 func rec ContactRecord Less other interface bool return rec sortKey Less other ContactRecord sortKe
  • 在c#中自定义ToolStripMenuItems

    我需要在我的应用程序中自定义 ToolStripMenuItems 每个打开子菜单的 ToolStripMenuItem 的文本附近都有一个黑色箭头 我想更改一些颜色 MenuItemSelected MenuItemBorder Menu
  • JavaScript 中仅比较日期部分而不比较时间

    下面的代码有什么问题 也许只比较日期而不是时间会更简单 我也不知道如何做到这一点 我进行了搜索 但找不到我的确切问题 顺便说一句 当我在警报中显示两个日期时 它们显示为完全相同 My code window addEvent domread
  • System.Data.DataException:初始化数据库时发生异常

    请帮我解决这个问题 我已经编写了使用 LINQ 从数据库获取第一条记录的代码 My Homecontroler CustomHandleError public class HomeController Controller Domain
  • 如何动态生成团队之间可能的遭遇?

    我感谢您提前在本练习中提供帮助 其中我还没有发现如何解决它的真相 如何动态生成团队之间可能的遭遇 具有以下输入字段 开始日期 teams fields 玩的天数 例如以下数据 const startDate 03 08 2020 const
  • MySQL - 连接上的特定列?

    在进行连接 内部 左外部 右外部或其他 时 如何指定表中的哪些列要连接到原始表中 考虑以下示例 SELECT FirstName FROM User LEFT OUTER JOIN Provider ON User ProviderID P
  • 谁能量化 C++ 和 Java 之间的性能差异?

    在 JIT 出现之前 Java 最初速度很慢 但现在的性能非常接近 C 我想知道是否有人对这两种语言进行了可衡量的性能比较 与C 相比 Java的不足在哪里 Java 为开发人员提供了许多生产力提升 因此他们可以更快地编写应用程序 因为没有