我在C和JAVA中都编写了一个简单的算术逻辑。但是C需要大约23.4s而JAVA需要大约4s才能完成执行。这个问题不是基于我如何计算代码中已经提到过的时间。这是基于执行。 C 代码如下。
#include<stdio.h>
#include<time.h>
main() {
clock_t begin = clock();
long i, temp;
for(i = 0; i<10000000000; i++)
temp = i * 5;
printf("temp : %ld\n", temp);
clock_t end = clock();
printf("time : %lf\n", (double) (end - begin) / CLOCKS_PER_SEC);
}
C 的输出为
temp : 49999999995
time : 23.477688
JAVA 代码如下
public class Test {
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
long num = 5, temp = 0;
for(long i = 0; i < 10000000000L; i++)
temp = num * i;
System.out.println(temp);
long endTime = System.currentTimeMillis();
long totalTime = endTime - startTime;
System.out.println("Execution time : " + totalTime);
}
}
JAVA 的输出是
49999999995
Execution time : 4194
我缺少要解释的东西JAVA比C
更有效答案 0 :(得分:-2)
不同之处在于Java和C的编译。 循环计算可以在运行时或编译时计算,具体取决于编译器优化。编译器编译为汇编代码,编译器可以生成具有循环最终结果的汇编。 例如,没有优化的x86-64 gcc 7.2编译器中的代码将生成以下汇编代码
.LC0:
.string "temp : %ld\n"
.LC2:
.string "time : %lf\n"
main:
push rbp
mov rbp, rsp
sub rsp, 32
call clock
mov QWORD PTR [rbp-24], rax
mov QWORD PTR [rbp-8], 0
.L3:
movabs rax, 9999999999
cmp QWORD PTR [rbp-8], rax
jg .L2
mov rdx, QWORD PTR [rbp-8]
mov rax, rdx
sal rax, 2
add rax, rdx
mov QWORD PTR [rbp-16], rax
add QWORD PTR [rbp-8], 1
jmp .L3
.L2:
mov rax, QWORD PTR [rbp-16]
mov rsi, rax
mov edi, OFFSET FLAT:.LC0
mov eax, 0
call printf
call clock
mov QWORD PTR [rbp-32], rax
mov rax, QWORD PTR [rbp-32]
sub rax, QWORD PTR [rbp-24]
cvtsi2sd xmm0, rax
movsd xmm1, QWORD PTR .LC1[rip]
divsd xmm0, xmm1
mov edi, OFFSET FLAT:.LC2
mov eax, 1
call printf
mov eax, 0
leave
ret
.LC1:
.long 0
.long 1093567616
但如果使用最高优化进行编译,则会生成以下汇编代码
.LC0:
.string "temp : %ld\n"
.LC2:
.string "time : %lf\n"
main:
push rbx
call clock
movabs rsi, 49999999995
mov rbx, rax
mov edi, OFFSET FLAT:.LC0
xor eax, eax
call printf
call clock
pxor xmm0, xmm0
sub rax, rbx
mov edi, OFFSET FLAT:.LC2
cvtsi2sdq xmm0, rax
mov eax, 1
mulsd xmm0, QWORD PTR .LC1[rip]
call printf
xor eax, eax
pop rbx
ret
.LC1:
.long 2696277389
.long 1051772663
你可以看到这里movabs rsi, 49999999995
编译器计算了循环的最终结果并将其放入寄存器中。