- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我运行的是 x86 处理器,但我认为我的问题很笼统。我很好奇 CMP + JE
序列与单个 MUL
操作所消耗的时钟周期的理论差异。
在 C 伪代码中:
unsigned foo = 1; /* must be 0 or 1 */
unsigned num = 0;
/* Method 1: CMP + JE*/
if(foo == 1){
num = 5;
}
/* Method 2: MUL */
num = foo*5; /* num = 0 if foo = 0 */
不要深入研究伪代码,它纯粹是为了阐明这两种方法背后的数学逻辑。
我实际上比较的是以下两个指令序列:
方法一:CMP + JE
MOV EAX, 1 ; FOO = 1 here, but can be set to 0
MOV EBX, 0 ; NUM = 0
CMP EAX, 1 ; if(foo == 1)
JE SUCCESS ; enter branch
JMP FINISH ; end program
SUCCESS:
MOV EBX, 5 ; num = 5
FINISH:
方法二:MUL
MOV EAX, 1 ; FOO = 1 here, but can be set to 0
MOV ECX, EAX ; save copy of FOO to ECX
MUL ECX, 5 ; result = foo*5
MOV EBX, ECX ; num = result = foo*5
似乎单个 MUL
(总共 4 条指令)比 CMP + JE
(总共 6 条指令)更有效,但消耗的时钟周期同样对于指令——即完成一条指令所需的时钟周期数是否与任何其他指令相同?
如果实际消耗的时钟周期取决于机器,那么在大多数处理器上,单个 MUL
是否通常比分支方法更快,因为它需要的指令总数更少?
最佳答案
现代 CPU 性能比仅仅计算每条指令的周期数远复杂。您需要(至少)考虑以下所有因素:
所有这些都会受到周围代码的严重影响。
所以基本上,执行这样的微基准测试并获得有用的结果几乎是不可能的!
但是,如果非要我猜的话,我会说没有 JE 的代码通常会更高效,因为它消除了分支,从而简化了分支预测行为。
关于c - CMP+JE 是否比单个 MUL 消耗更多的时钟周期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16821739/
我听说 x86 指令集中的条件跳转指令限制为 256 字节。 (换句话说,跳转不能超过 256 字节。) 这是真的吗?我一直在编写涉及 JMP 指令的逻辑来解决这个问题。有必要吗? 最佳答案 IA32
我正在测试 BerkeleyDB Java 版,以了解我是否可以在我的项目中使用它。 我创建了非常简单的程序,它与 com.sleepycat.je.Database 类的对象一起使用: 写入 N 条
我想了解 cmp 和 je/jg 在汇编中是如何工作的。我在谷歌上看到了几个例子,但我还是有点困惑。下面我展示了我试图转换为 C 语言的汇编代码的一部分以及相应的 C 代码。它是以正确的方式实现的还是
我一直在使用 BDB JE,因为它是由 SleepyCat 开发的,后来被 Oracle 收购,现在许可政策还不清楚。那么有什么可以替代这种键值数据库 键和值对象的自定义序列化程序 拥有二次收藏的能力
我正在尝试在 中插入 ~ 56,249,000 个项目berkeleydb-JE .我跑了数据库缓存大小 获取有关我的数据库的一些统计信息: java -jar je-5.0.34.jar DbCa
.L10: leal (%rsi,%rsi,4), %edx movsbl %al,%eax addq $1, %rdi leal -48(%rax
我刚刚开始学习汇编,并正在制作一个简单的引导加载程序作为我的操作系统类(class)的一部分。我正在努力使我的代码更加高效,也就是说,我认为到目前为止我所做的并不是实现我想要的目标的特别好的方法。也就
我想在 BerkeleyDB 中创建一个序列,我可以手动操作它,但我不知道该怎么做。我想要一个类似于 SQL 序列对象的东西。我在 API 文档中找到了一个类,但不清楚如何创建一个类。 非常感谢任何帮
我正在调试系统中的磁盘空间问题,发现 .jdb 文件占用了大部分空间。 浏览时,发现此链接https://backstage.forgerock.com/knowledge/kb/article/a1
有没有办法向 API 请求打开游标的列表(或至少当前打开游标的数量)? 最佳答案 OTN 的人 answered这对我来说。 简而言之,不,没有 API 方法来获取打开游标的计数。 关于java -
我计划在 BerkeleyDB JE 中插入大量唯一键 (~3E9)数据库。 键的长度是固定的(~10 字节),但值的长度是可变的。数据库不会是事务性的。 您会为 EnvironmentConfig
berkeley-db-je 的最新版本是什么? 来自 oracle , 为 7.5。 但来自maven存储库,它是 18.3.12。 有没有人知道更多的细节? 最佳答案 Berkeley DB Ja
好吧,我开始进行一些组装工作。我从以下说明开始: test al, al jne 0x1000bffcc 使用调试器,我希望代码不跳转到地址 0x1000bffcc,因此我在
我正在反汇编具有以下 je 函数的代码: 0F 84 FF 00 00 00:je loc_00000105 我被指示通过将 je 修改为 jne 来绕过比较函数。这是一个奇怪的案例,因为我到处都经历
我正在反汇编具有以下 je 函数的代码: 0F 84 FF 00 00 00:je loc_00000105 我被指示通过将 je 修改为 jne 来绕过比较函数。这是一个奇怪的案例,因为我到处都经历
我会在每次迭代中递减 RAX。如果 RAX 为零,程序应该改变流程。 # AT&T syntax start_calc_factorial: decq %rax cmpq $0, %rax
我有数据库/home/panayk/Desktop/panag_3/panag_3.tld: $ db_verify /home/panayk/Desktop/panag_3/panag_3.tld
我正在寻找一种有效的方法来在 Berkeley DB 中实现比较和交换操作。现在我使用的是非常旧的版本,但是乍一看,即使是最新的版本(从 Oracle 网站分发)也没有单一的方法来进行此类操作。 我正
我运行的是 x86 处理器,但我认为我的问题很笼统。我很好奇 CMP + JE 序列与单个 MUL 操作所消耗的时钟周期的理论差异。 在 C 伪代码中: unsigned foo = 1; /*
我正在尝试列出给定 Berkeley DB Java 版实例中的所有现有数据库环境 (com.sleepycat.je.Environment)。找不到与此相关的任何 API 或文档。 扫描包含所有环
我是一名优秀的程序员,十分优秀!