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花费更多时间执行[重复]的主要内容,如果未能解决你的问题,请参考以下文章
cout打印包含比设定长度更多的字符的char []? [重复]