- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
问题:这更多是出于好奇。如果我有一个 Java if/else
语句,并且我知道“if/else”语句的一个分支将比另一个分支更频繁地被采用,那么我订购的方式是否可以两个分支向 JIT 编译器提供了一个提示,从而获得更好的性能?
背景:在我对计算机体系结构的简单看法中,“if/else”语句被转换为条件跳转指令,后跟如果未执行跳转则应执行的指令。内存中的其他地方将是跳转所针对的代码。据我了解,CPU 会尽可能地按顺序加载指令(我确定我在这里忽略了分支预测器),并且非跳转路径更有可能被加载到指令缓存和 CPU 的指令流水线。
问题重述:if/else
语句的分支的合理排序能否增加经常执行的代码紧跟条件跳转指令的可能性,从而呈现代码对缓存和管道更友好?
现实:听到 JIT 编译器是一个如此复杂的软件,在完成所有指令重新排序、寄存器分配和其他簿记之后,我不会感到惊讶,它可以'不要做出这样的保证。
我的大部分“if/else”语句都不会执行,所以我不会在任何地方都这样做。此外,很多时候我会猜错哪个分支将更频繁地执行,最终实际上会损害性能。
我想认为像故意使用分支排序这样简单的事情不会被认为是过早的优化,但如果是这样,我只会在探查器向我显示代码很慢时才弄乱排序。
谢谢!
最佳答案
没有。
你不能。你不需要。
这对编译器来说有一定的意义,因为它可以翻译
if (improbable) {
doSomething();
} else {
doSomethingElse();
}
doMoreThings();
return;
进入(伪代码)
if (improbable) goto away
doSomething()
back: doMoreThings()
return
away: doSomethingElse()
goto back
这样更可能的路径就被精简了。一个AOT编译器可以依赖所提供的信息。
您不需要。但是 Java 会做这些事情 JIT编译器在收集统计信息后始终如此。在这里,javac
是无关紧要的,因为字节码被解释器执行了几次,这很慢,但对于很少执行的部分来说已经足够好了,也足以收集统计数据。通常,这些统计数据比程序员可能提供的要好,但更重要的是:它们是为每个与时间相关的代码片段收集的。它实际上更复杂,因为那里有 C1 和 C2 编译器......
你不能。在字节码中没有标准化的表达方式。此外,优化器将代码转换为内部表示,这样的细节就会丢失。
过早的优化 算了吧。编译器可以很好地完成更复杂的事情。一些低级优化仍然有意义,但仅限于非常极端的情况。寻求干净的代码,如果需要,也许一些高级优化。
关于Java if 语句结构和指令流水线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38491758/
我需要多少档才能正确执行以下指令。我对我所做的事情有些困惑,所以我在这里看到专家的答案。 lw $1,0($2); beq $1,$2,Label; 请注意,检查是否会发生分支将在解码阶段完成。但是在
我正在用 C 语言编写这段代码,它计算并绘制 6 级流水线和超标量架构上的周期总数。代码编译得很好,但是当我运行它时,出现段错误。 我在此选项中遇到段错误。我输入我的选择为 1,然后输入总周期为 5。
我一直在阅读有关流水线的内容,也阅读了这个主题 - How to send a simple string between two programs using pipes? 我阅读了@jschmie
我刚刚在读这个Wikipedia article在 HTTP 流水线和图表中,似乎可以在一个连接上同时发送响应。我是不是误解了图表,或者这是允许的吗? Section 8.1.2.2 of RFC 2
我试图了解什么是 HTTP 流水线和 HTTP keep-alive 连接,并试图在这两个主题和 Server Sent 事件技术之间建立联系。 据我了解,HTTP keep-alive connec
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
背景 Rainbond 本身具有基于源码构建组件的能力,可以将多种编程语言的代码编译成 Docker 镜像,但是在持续集成的过程中,往往会需要对提交的代码进行静态检查、构建打包以及单元测试。之
前面我们创建的两个任务 test 和 build-and-push 都已经完成了,我们还可以创建一个流水线来将这两个任务组织起来,形成一个流水线,这里就是我们要使用的 Pipeline 这个 C
我将数据表与 pipelining 一起使用.我工作得很好,除非我试图输入一个额外的列来保存“编辑”链接。参见 this表。 这是显示列的 server_processing.php 片段: /
Go 新手。我正在尝试编写一个“流水线”,其中多个函数像 worker 一样工作,并在流水线中将一些数据结构传递给彼此,每个函数都对数据结构做一些事情。 type orderStruct struct
我正在尝试弄清楚 DataFlow 如何扩展某些操作以及如何使其表现最佳。首先,我刚刚创建了一个简单的流程,它从 BigQuery 中读取数据(约 2500 万行,总共 30GB),进行 JSON 提
我正在学习 BASH,我的问题如下。 我正在使用 tar -zxvf 解压缩一个文件,这会返回一个(我认为)是一个列表类型 ls -l 从它被提取的文件夹.我想要做的是使用 head -1 获取它的第
我必须在 Java 中实现一个 HTTP 客户端,对于我的需要来说,最有效的方法似乎是实现 HTTP 管道(根据 RFC2616)。 顺便说一句,我想对 POST 进行流水线处理。 (此外,我不是在谈
我每分钟有数千个小文件(大约 1 KB)要上传到 S3。如果我上传循环中的每个文件“发送我的 HTTP 请求 - 等待 S3 的 HTTP 响应 - 发送下一个请求 - 等待下一个响应......”,
假设我有一个来自机器 A 的 MPI_Send,其中包含一条巨大的消息,而在另一台机器(比如 B)上,它正在通过 MPI_Recv(或分别为 MPI_isend 和 MPI_irecv)接收。目前,B
有人可以确认 CacheManager.Net 是否支持 redis 流水线吗? 我在 documentation 中找不到它 非常感谢。 干杯,你 最佳答案 有点。CacheManager 不直接支
我最近一直在编写 x86 程序集(为了好玩),并且想知道 rep 前缀字符串指令是否真的在现代处理器上具有性能优势,或者它们是否只是为了向后兼容而实现的。 我可以理解为什么英特尔最初会在处理器一次只运
我正在学习本教程: https://www.linkedin.com/pulse/building-docker-pipeline-cloudbees-jenkins-jay-johnson 我在 D
我的公司已决定过渡到基于微/服务的架构。 在过去的几个月里,我们一直在做大量的研究,以了解这个东西的架构究竟会是什么样子。 到目前为止,我们已经确定: 用于服务开发的 Dotnet 核心(尽管与语言无
我想尝试使用 Cap'n Proto C++ RPC 进行 promise 流水线操作,但我不知道该怎么做。 这是我的模式: interface Test { getInt @0 () -> (i
我是一名优秀的程序员,十分优秀!