问题描述
C语言代码inti=0;for(i=0;i<999000000;++i){}
运行时间花了2秒多一点for(inti=0;i<999000000;i++){}
运行时间花了354毫秒左右。本人预测C语言会比C#的for循环快。怎么会相反呢?而且还远不如C#的for循环。这是为什么,忘各位大师指点迷津
解决方案
解决方案二:
因为JIT做过一次循环后发现什么也没做,于是机智的跳过后面的循环直接给i赋值了没开优化的C编译器还是老实巴交的慢慢数不开优化就是耍流氓
解决方案三:
可是我这样改了,运行时间还是毫秒DateTimed=DateTime.Now;inttotal=0;for(inti=0;i<999000000;i++){total+=i;}doubledou=(DateTime.Now-d).TotalMilliseconds;MessageBox.Show(dou.ToString());
解决方案四:
C语言的时间算法跟C#的不一样啦。这样肯定是对比不了的。
解决方案五:
我的意思是,JIT会进行优化
解决方案六:
引用1楼iyomumx的回复:
因为JIT做过一次循环后发现什么也没做,于是机智的跳过后面的循环直接给i赋值了没开优化的C编译器还是老实巴交的慢慢数不开优化就是耍流氓
编译器有如此聪明?
解决方案七:
引用5楼bwangel的回复:
Quote: 引用1楼iyomumx的回复:
因为JIT做过一次循环后发现什么也没做,于是机智的跳过后面的循环直接给i赋值了没开优化的C编译器还是老实巴交的慢慢数不开优化就是耍流氓编译器有如此聪明?
这只是打个比方,现代的编译器把空循环优化掉是很普遍的行为
解决方案八:
for(inti=0;i<999000000;i++){i=i+i%10;i=i-i%10;}这样就优化不了了,再比较理论上C#和C++一样快。
解决方案九:
引用5楼bwangel的回复:
Quote: 引用1楼iyomumx的回复:
因为JIT做过一次循环后发现什么也没做,于是机智的跳过后面的循环直接给i赋值了没开优化的C编译器还是老实巴交的慢慢数不开优化就是耍流氓编译器有如此聪明?
其实比这个更聪明得多,比如i<999000000这个判断,因为i一开始远小于这个数字,所以实际上还会跳掉很多次判断....
解决方案十:
关于纯数字运算,C和C#性能完全一样,我做过专门的测试
解决方案十一:
坐等专业解答。。。
解决方案十二:
专家呢看看专家怎么说
解决方案十三:
我也想知道结果.
解决方案十四:
应该是一样快的吧
解决方案十五:
把汇编代码拉出来一对比不就O了
解决方案:
我们都是对比大的数据处理,没有纠结过个别语句的对比。
解决方案:
如果说到计算本身,基于虚拟机的计算在优化上确实占有优势,例如可以根据CPU的不同而临时产生不同的代码。但是它一般来说都进行了复杂的“防溢出、数据保护”代码。其实在个别语句上没有什么可比性。如果要比较,应该也不会差出多少。
解决方案:
C跟C++,在描述多维字符数组的时候,是个非常痛苦的事情
解决方案:
不熟悉就别瞎测,浪费精力时间。一个最简单的for循环,能翻出什么花样,什么语言都差不多。至于C2秒,绝对是debug配置+调试器附加。C/C++附加调试器后对速度的影响非常大。以前在javaeye还是开源中国有一个帖子,也是一眼就看出来是附加了调试器的东西,那帮人还撕接近十页。你这个代码,release配置、不附加调试器,C++运行时间绝对是0。别说你一个空循环,就算是循环内有代码,只要最后用不上,照样给你砍了。