最近在研究并行的时候与到了一个让我迷糊的问题。
先看如下代码
            for (int i = 0; i < 100000; i++)
                for (int k = 0; k < 100000; k++)
                {
                    
                }        For i As Integer = 0 To 100000
            For k As Integer = 0 To 100000            Next
        Next在我的计算机上运行以上两段代码分别用了4250(C#),8484(VB),C#快了一倍。
我觉得有问题,所以我把代码发给其他人让他们分别进行测试,可得到的结果却让我更迷糊了。
路人甲(Intel P8400 2.29GHz)
278945(C#),246294(VB)路人乙(Intel T7500 2.2GHz)
35381(C#),25366(VB)我的计算机(Intel E4600 2.4GHz)问题一
为何我机器上VB.NET编写的程序会比C#编写的慢一倍,而其他人的机器却都是VB的比C#的要快?问题二
为何我的计算时间会比其他人的都快了近10倍?我的CPU虽然比其他人的要好些,可也不至于有如此大的差距吧?

解决方案 »

  1.   

    .net的时间计算我不太相信
    去年做过两个snmp类库的效率测试
    C++统计的时间比较符合实际
    C#统计时间居然在一个socket操作后时间间隔是0,当时用的是vs2008,TimeSpan
    出现几个0后,又出来一个合理的数字,崩溃后来是抓包看时间差统计的
      

  2.   

    用stopwatch统计时间运行再看看
      

  3.   

    另外,最好运行.exe看,而不要再.net中F5运行
      

  4.   

    呵呵 我没测试过 有点好奇
    你比别人快了近10倍?  也就是说 如果你要花10秒 人家要100秒
    是不是别人在玩dota的时候测试的啊
    我猜你的测试还是存在诸多干扰因素在里面    
      

  5.   

    对了,再补充一个条件。
    我的机器是XP,其他人的都是WIN7,不知道和这个有没有关系
      

  6.   

    我按照楼主你的代码在不同的计算机上进行了测试,
    得到的结论是Intel的CPU上,普遍是VB.NET稍快些,
    我反编译了生成的exe程序,发现VB.NET的代码被翻译成了do-while语句,不知道和这个有关没有。AMD的CPU上测试的结果是两种语言的程序执行时间几乎相等。但所有的测试时间都没有楼主机器上那样快,我在Althon II X3(3核心 2.9GHz)上使用Paralell并行计算获得的结果都有7秒多,而楼主的机器虽然是双核,但未并行的情况下使用的是2.4GHz的单核心居然跑出了远超3核心并行的2.9GHz的CPU,这个我真不知道是为什么。
    但看数据,你在路人的机器上获得的数据应该是比较合理的。没能帮楼主找出原因,希望这些测试结果可以帮到你。
      

  7.   

    用Debug  Release分别编译成EXE后,再到其它人电脑上测试要注意,测试的结果必须包括
    1. 操作系统版本
    2. CPU
    3. 内存,并且是否双通道
    4. 项目类型(Winform、Console、Asp.net)
    这样才能统计下1. Win7 Sp2
    2. 赛扬 E3300 超频到3.33G
    4. 内存 3G,外频800,本人认为不是双通道,CPU-Z中显示双通道
    4. Console跑分
    一、C#
    1. Debug 
          开始执行不调试 22720  开始执行调试 22625  基本一致,在误差范围内
    2. Release 
          开始执行不调试 3120   开始执行调试 22325  相差很大二、VB
    1. Debug 
          开始执行不调试 20545  开始执行调试 19251 基本一致,在误差范围内
    2. Release 
          开始执行不调试 6256   开始执行调试 22136  相差很大三、以上结果都测试了多次,基本在上述结果上下浮动,可认为是误差四、VB在Release下,居然和C#相差一倍,未解五、顺便问问楼主及各位兄弟,为什么VS 2008下
        1.Release模式也能调试(其实可以猜到,Release模式下,按F5生成的代码在执行效率上既然和Debug模式没差别,那其实就是Debug模式了,但仅是猜测,有没有板油有理论依据的)
        2.Release模式下,DLL文件或EXE文件,也生成PDB文件(应该是调试信息吧),每次都要删除,烦啊,有没有什么办法Release模式下不生成
      
        最后,提醒楼主,VB中的内外循环都比C#多一次,在我代码里已修正。
      

  8.   

    不难看出,楼主用的是Releae模式,其他人用的是Debug模式另外,我和楼主的结果都符合C#比VB快一倍的结论(Release模式)
      

  9.   


    即使在VS2010下,Release模式也是可以调试的。
    不明白为什么你的测试结果中,VB的Release模式比C#的慢一倍,我又在Release模式下进行了测试,结果是两者时间消耗几乎相等。
      

  10.   


    楼主的结果 4250(C#),8484(VB),和我结果大体表现一致。你用的是2008还是2010?
      

  11.   

    我的测试也是C$比vb快了近一倍,我的机器是老机器(2006年的,ddr2G),c#6453毫秒,vb11000毫秒。win7操作系统。
      

  12.   

    上面说的是Release的Exe文件,而在开发环境里f5运行(Realase模式)VB与C#相差不多,而Debug模式vb要比c#快不少,约快70%
      

  13.   

    我已经对编译后的exe进行了反编译,查看了优化后的代码,我在不确定代码被执行的情况下,是不会发这个问题的。
    而且如果什么也不执行的话,程序该立刻显示运行时间,而不是消耗了几秒或者几十秒之久
      

  14.   

    debug版本 和 正是版本的速度差别似乎很大的
      

  15.   

    对了,再补充一个条件。
    我的机器是XP,其他人的都是WIN7,不知道和这个有没有关系 
      

  16.   

    这种测试。。不靠谱的
    因为cpu的并行性,之间都会休眠的,时间肯定在变!
      

  17.   

    用的.Net版本不一样?比如2、3.5、4?
    要用C++测这段程序才叫快呢:) 
    可加点运算以阻止编译器优化掉空循环:int dummy = 0;
    for (int i = 0; i < 100000; ++i){
      for (int k = 0; k < 100000; ++k)
      {
        dummy ^= k;
      }
      dummy ^= i;
    }
    return dummy;
      

  18.   

    另外,最好运行.exe看,而不要再.net中F5运行
      

  19.   

    我的经验,数值计算的时候xp比win7快,向你这种什么都不做的代码...C语言用户一笑而过
      

  20.   

    我的老机器并不慢多少(c#编译后的),win7下6秒多
      

  21.   

    看了一下。两者的IL。生成的IL相差很大。
      

  22.   

    我写的测试的例子。
    http://download.csdn.net/detail/zanfeng/3658162
      

  23.   

    和CPU的缓存情况也有关系吧。看过类似下面两个版本的代码吗:    for (int i = 0; i < 100000; i++)
            for (int k = 0; k < 10; k++)
            {
                
            }    for (int i = 0; i < 10; i++)
            for (int k = 0; k < 100000; k++)
            {
                
            }
      

  24.   

    影响程序运行效率的因素不过以下五点:1、硬件环境:包括CPU、内存、硬盘(包括合适的缓存)等。
    2、操作平台:主要指操作系统,同为win平台,vista32/64、win7 32/64运行效率就不一样。
    3、软件环境:主要指运行所处系统中,对效率有影响的其它软件,如后台服务、活动/待活动软件(包括迅雷、360……)
    4、编译选项:主要指代码编译选项的配置情况,如效率、大小、是否需要调试……,不同软件需要有些许不同,导致编译出来的目标程序区别较大;如嵌入式软件既要小又要快,那就要牺牲许多容器和封装;而一些注重界面和人机交互的软件则不太在乎效率和大小,侧重功能;还有其它许多影响编译选项的情况。
    5、运行形态:主要指是否带调试运行(即通常的F5),如果非带调运行且关闭调试项的话,软件效率就取决于前三个了,结论比较简单明了,C#/VB区别应该不大;如果是在调试环境运行,则影响因素除了前四个,还有调试环境的配置情况,如C#、VB安装的模块、开发环境选项、外部组件加载情况……
      

  25.   

    试着跑了一下
    环境: win7,vs2010 sp1,CPU:Pentinum Dual-Core T4500 @2.30GHz,内存:2.00GB
    debug模式下
    vc:24秒
    c#:33秒
    release模式下
    vc:7秒
    c#:27秒这里注意的就是 楼上几位已经指出的,必须加入计算,否则,编译器会优化掉,不执行任何操作.各位牛人,知道这样测试没什么意义,只是玩玩而已,请不要冲动啊.代码如下:
    vc代码#include <time.h>
    #include <iostream>int main()
    {
    clock_t startDT = clock();
    int dummy = 1;
    for (int i = 0; i < 100000; ++i)
    {
    for (int k = 0; k < 100000; ++k)
    {
    dummy ^= k;
    }
    dummy ^= i;
    }
    std::cout<<"dummy: " << dummy << std::endl; clock_t stopDT = clock(); std::cout<<"耗时: " << (stopDT - startDT)<<std::endl;
    }c#代码 class Program
        {
            static void Main(string[] args)
            {
                DateTime startDT = DateTime.Now;
                int dummy = 1;
                for (int i = 0; i < 100000; ++i)
                {
                    for (int k = 0; k < 100000; ++k)
                    {
                        dummy ^= k;
                    }
                    dummy ^= i;
                }
                Console.WriteLine("dummy: " + dummy.ToString());
                DateTime stopDT = DateTime.Now;
                TimeSpan cost = stopDT - startDT;
                Console.WriteLine("耗时: " + cost.TotalMilliseconds.ToString());
                
            }
        }
      

  26.   

    还有,如果不输出dummy的话,编译器同样会优化掉,所以,这里的代码多了这样一行.
      

  27.   

    .net的时间计算我不太相信
    去年做过两个snmp类库的效率测试
    C++统计的时间比较符合实际
      

  28.   

    是的.net中需要做大量的初始化和维护工作,所以 实时性确实较低.