为什么同样的代码java运行比c快

tektekman 2013-05-21 04:39:15
c语言:
#include <stdio.h>
#include <time.h>

int main(){
clock_t time = clock();
int n = 0;
int i;

for(i=0; i<1000000000; i++){
n += i;
}

time = clock()-time;

printf("%d %lld\n", n, time/1000);

return 0;
}


java:
public class Main{
public static void main(String[] args){
long time = System.currentTimeMillis();
int n = 0;
int i;

for(i=0; i<1000000000; i++){
n += i;
}

time = System.currentTimeMillis()-time;

System.out.println(n+" "+time);
}
}

求大神解释?
...全文
1247 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
angel_su 2013-05-22
  • 打赏
  • 举报
回复
引用 9 楼 mLee79 的回复:
唉.. gcc没有优化成类似下面的目标代码, 太失望了
可能侦测溢出,所以没优化,long long n,应该0秒杀...
lin5161678 2013-05-22
  • 打赏
  • 举报
回复

楼主体会一下
lin5161678 2013-05-22
  • 打赏
  • 举报
回复
C开优化了没有 汗哒哒
素事 2013-05-22
  • 打赏
  • 举报
回复
debug下说个蛋...
Simeone_xu 2013-05-22
  • 打赏
  • 举报
回复
java 还要跑虚拟机
Simeone_xu 2013-05-22
  • 打赏
  • 举报
回复
不可能 如果真是一样的 肯定是C更快的
yue214 2013-05-22
  • 打赏
  • 举报
回复
C语言还是不错的嘛~~~
huanglin03 2013-05-22
  • 打赏
  • 举报
回复
可怜那些老鸟都没试,就在那主观意淫,说循环数太大,扯编译器优化。。。,1000000000又没超过int范围 ,JAVA中int也是4字节,8楼才是大神,一语切中要害!!!!!!
huanglin03 2013-05-22
  • 打赏
  • 举报
回复
RELEASE的绝对C快!!

mujiok2003 2013-05-22
  • 打赏
  • 举报
回复
同样的算法, c一般比java快。
UnknowName 2013-05-22
  • 打赏
  • 举报
回复
VC下不做评论。
huanglin03 2013-05-22
  • 打赏
  • 举报
回复
我操尼玛,果然还是C快啊,RELEASE版的绝对比JAVA快啊
huanglin03 2013-05-22
  • 打赏
  • 举报
回复
没看清,JAVA返回的是毫秒数,呵呵
huanglin03 2013-05-22
  • 打赏
  • 举报
回复
你是怎么运行的啊,我这执行的还是C快啊,java=1062 C=3有图有真像!!!
mLee79 2013-05-22
  • 打赏
  • 举报
回复
唉, 试了下, M$VC VS2010, 64位的编译器优化基本上就打酱油的, 下面的代码, 32位编译器还能优化成 n += 8*i + 28; 64位的编译器却没有任何优化, 晕死了.. gcc 则不管咋写都是秒杀...

#include <stdio.h>
#include <time.h>


int main(){
	long long n = 0;
	int i;

	for(i=0; i<1000000000; i+=8)  {
		n += i + 0;
		n += i + 1;
		n += i + 2;
		n += i + 3;
		n += i + 4;
		n += i + 5;
		n += i + 6;
		n += i + 7;
	}
		
	printf("%lld %d\n", n , clock() );

return 0;
}
mLee79 2013-05-22
  • 打赏
  • 举报
回复
引用 16 楼 angel_su 的回复:
[quote=引用 9 楼 mLee79 的回复:] 唉.. gcc没有优化成类似下面的目标代码, 太失望了
可能侦测溢出,所以没优化,long long n,应该0秒杀...[/quote] 这个是正解, long long n , gcc 直接优化成 499999999500000000 鸟. 不过M$VC生成的代码还是一塌糊涂...
赵4老师 2013-05-22
  • 打赏
  • 举报
回复
对学习编程者的忠告: 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步对应汇编一行! 使用电脑计时有时误差会很大,因为待测程序段的运行会影响电脑时钟。 将待测程序段循环足够多次,手动掐秒表计时可能更准确。 当然帖主这个肯定不用手动掐秒表了。
边走边瞧 2013-05-22
  • 打赏
  • 举报
回复
引用 33 楼 bug1190 的回复:
有溢出怎么了,有溢出也是n溢出,有溢出JAVA不也照样有溢出吗?不是比执行效率吗,管溢出啥子事,再说了就算有溢出,溢出了也照加
溢出仍然计算加法,那是没有设置编译器优化才会这么做。MS的编译器默认选项,debug是没有优化的,release是按最快速度。优化和不优化,产生的目标文件不一样。 同样的代码,相似的优化方法,java最多接近C的运行速度。
huanglin03 2013-05-22
  • 打赏
  • 举报
回复
引用 32 楼 go_and_see 的回复:
[quote=引用 25 楼 bug1190 的回复:] 可怜那些老鸟都没试,就在那主观意淫,说循环数太大,扯编译器优化。。。,1000000000又没超过int范围 ,JAVA中int也是4字节,8楼才是大神,一语切中要害!!!!!!
看代码不认真,罚你重看,真的没有溢出?

for(i=0; i<1000000000; i++)
{
n += i;
}
[/quote] 有溢出怎么了,有溢出也是n溢出,有溢出JAVA不也照样有溢出吗?不是比执行效率吗,管溢出啥子事,再说了就算有溢出,溢出了也照加
边走边瞧 2013-05-22
  • 打赏
  • 举报
回复
引用 25 楼 bug1190 的回复:
可怜那些老鸟都没试,就在那主观意淫,说循环数太大,扯编译器优化。。。,1000000000又没超过int范围 ,JAVA中int也是4字节,8楼才是大神,一语切中要害!!!!!!
看代码不认真,罚你重看,真的没有溢出?

for(i=0; i<1000000000; i++)
{
n += i;
}
加载更多回复(15)

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧