C比JAVA花费更多时间执行[重复]

Posted

技术标签:

【中文标题】C比JAVA花费更多时间执行[重复]【英文标题】:C taking more time to execute than JAVA [duplicate] 【发布时间】:2017-08-20 09:56:56 【问题描述】:

我用 C 和 JAVA 编写了一个简单的算术逻辑。但是 C 需要将近 23.4 秒,而 JAVA 需要大约 4 秒才能完成执行。这个问题不是基于我如何计算我认为代码中已经提到的时间。这是基于执行。 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 更有效

【问题讨论】:

这包括两分钟的运行热身吗? 你确定你的java代码真的执行了循环吗?您只需要最后一次迭代的结果。使用优化编译 C 代码很有可能消除循环。 GCC 仅在未明确告知要更积极地优化时才应用非常基本的优化。试试-O3 标志。详情请见the manual。 我的 GCC 需要 0.000051-03 优化 @SridharRamanathan 编译选项是-O3不是 -o3 【参考方案1】:

区别在于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/

【讨论】:

投反对票,虽然这个答案是正确的,但它并没有试图更好地解释这个问题。措辞也令人困惑,使答案难以理解。

以上是关于C比JAVA花费更多时间执行[重复]的主要内容,如果未能解决你的问题,请参考以下文章

定时执行语句 - C++ [重复]

它怎么能获得比我想要的更多的内存?(C++)[重复]

为啥python处理排序列表比未排序列表花费更多时间

cout打印包含比设定长度更多的字符的char []? [重复]

为啥最后一次“ResultSet.next()”迭代比之前的迭代花费更多的时间?

为什么被破坏的对象比创建的更多[重复]