c语言for循环与C#for循环性能对比

问题描述

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。别说你一个空循环,就算是循环内有代码,只要最后用不上,照样给你砍了。

时间: 2024-10-05 19:32:16

c语言for循环与C#for循环性能对比的相关文章

for循环与for in,$(&#039;&#039;).each 与$.each的区别

一:for循环与for in的区别 for...in 语句用于对数组或者对象的属性进行循环操作. 语法: for (变量 in 对象) {     在此执行代码 } for循环是对数组的元素进行循环,而不能引用于非数组对象(类数组对象也可以遍历). 语法: for(int 变量初始值;条件;递增或递减){     在此执行代码 } 用for in遍历window对象的属性. for(var prop in window){ console.log(winodw[prop ]) }   用for

java List循环与Map循环的总结_java

java  List循环与Map循环的总结 做了一下list和map的总结,没有什么技术含量,就全当复习了一下api. 测试环境是在junit4下,如果没有自己写一个main方法也是一样的. 首先是List的三种循环: @Test public void ForListTest() { List<String> list = new ArrayList<String>(); list.add("1"); list.add("2"); list

thinkPHP模板中for循环与switch语句用法示例_php实例

本文实例讲述了thinkPHP模板中for循环与switch语句用法.分享给大家供大家参考,具体如下: 1.for用法 <for start="开始值" end="结束值" comparison="" step="步进值" name="循环变量名" > </for> 案例 <for start="1" end="100"> {$i}

J2ME循环与String优化设计

通常我们撰写循环时,习惯让计数变量从0 开始,然后累加.但是,只要做一点小小的更改,就可以让程序跑的更快,范例程序如下: //PerfTest.java import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class PerfTest extends MIDlet { public PerfTest() { } public void startApp() { long start,end ;

js使用for循环与innerHTML获取选中tr下td值

 function getParentEl (el, tagName) { if (!el) return el;    do { el = el.parentNode; } while(el && el.tagName !== tagName);    return el; }    function temp(){ //得到选中row的value值 var temp=document.getElementsByName('id'); for(var i=0;i<temp.leng

一个shell for循环与case结合的脚本(监控程序状态)_linux shell

核心代码: 复制代码 代码如下: #/bin/bashset -xHOSTS="nginx mysql php-cgi"for myhost in $HOSTS  do  count=(`ps aux |grep $myhost |grep -v grep |wc -l`)  echo "$myhost"  echo "$count" if [ $count -eq 0 ]; then  case $myhost in  nginx)   cd

Android开发笔记之:消息循环与Looper的详解_Android

Understanding LooperLooper是用于给一个线程添加一个消息队列(MessageQueue),并且循环等待,当有消息时会唤起线程来处理消息的一个工具,直到线程结束为止.通常情况下不会用到Looper,因为对于Activity,Service等系统组件,Frameworks已经为我们初始化好了线程(俗称的UI线程或主线程),在其内含有一个Looper,和由Looper创建的消息队列,所以主线程会一直运行,处理用户事件,直到某些事件(BACK)退出.如果,我们需要新建一个线程,并

JS数组的遍历方式for循环与for...in_javascript技巧

JS数组的遍历方法有两种: 第一种:一般的for循环,例如: var a = new Array("first", "second", "third") for(var i = 0;i < a.length; i++) { document.write(a[i]+","); } 输出的结果:fitst,second,third 第一种:用for...in 这种遍历的方式,例如: var arr = new Array(&

js使用for循环与innerHTML获取选中tr下td值_javascript技巧

function getParentEl (el, tagName) { if (!el) return el; do { el = el.parentNode; } while(el && el.tagName !== tagName); return el; } function temp(){ //得到选中row的value值 var temp=document.getElementsByName('id'); for(var i=0;i<temp.length;i++){ i