灵感来自这个问题: 为什么处理排序数组比处理未排序数组更快?
我写了自己的分支预测实验:
public class BranchPrediction {
public static void main(final String[] args) {
long start;
long sum = 0;
/* No branch */
start = System.nanoTime();
sum = 0;
for (long i = 0; i < 10000000000L; ++i)
sum += i;
System.out.println(System.nanoTime() - start);
System.out.println(sum);
/* With branch */
start = System.nanoTime();
sum = 0;
for (long i = 0; i < 10000000000L; ++i)
if (i >= 0)
sum += i;
System.out.println(System.nanoTime() - start);
System.out.println(sum);
/* No branch (again) …Run Code Online (Sandbox Code Playgroud) 我写了一个非常简单的c程序:
#include<stdio.h>
int main(){
int a=2;
int b=0;
printf("%d\n", a/b);
}
Run Code Online (Sandbox Code Playgroud)
并使用strace运行它:strace ./a.out并获得以下输出(仅粘贴尾部)
... ...
mprotect(0x600000, 4096, PROT_READ) = 0
mprotect(0x7f04c7fb8000, 4096, PROT_READ) = 0
munmap(0x7f04c7f96000, 127640) = 0
--- SIGFPE (Floating point exception) @ 0 (0) ---
+++ killed by SIGFPE +++
Floating point exception
Run Code Online (Sandbox Code Playgroud)
输出符合我的预期,因为它被SIGFPE信号杀死.
但是,用Java编写的相同程序,没有得到SIGFPE信号,有没有人知道java进程如何"除以零"异常?
public class Main {
public static void main(String[] args) {
int a = 2;
int b = 0;
System.out.println(a / b);
}
}
Run Code Online (Sandbox Code Playgroud)
strace java -Xcomp Main
... ...
mprotect(0xf6949000, 8171520, PROT_READ|PROT_WRITE) …Run Code Online (Sandbox Code Playgroud)