C比JAVA花费更多时间执行

时间:2017-08-20 09:56:56

标签: java c optimization execution

我在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

更有效

1 个答案:

答案 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编译器计算了循环的最终结果并将其放入寄存器中。

我用过:https://godbolt.org/