下面的代码用4.0编译比用3.5编译执行的时间高出许多,不知道大家跑出来的结果是不是和我一样,谁知道有什么详细的文档资料能解释这个现象?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Data.SqlClient;
using System.Security.Permissions;namespace ConsoleApplication1
{ [SqlClientPermission(SecurityAction.Demand)]
 public class Class1
 {
  public void Test()
  { }
 } class Program
 {
  static void Main(string[] args)
  {
   Class1 c;   Stopwatch w = new Stopwatch();
   w.Start();
   for (int i = 0; i < 10000; i++)
   {
    c = new Class1();
    c.Test();
   }
   w.Stop();   Console.WriteLine(w.ElapsedMilliseconds);
  }
 }
}

解决方案 »

  1.   

    时间是不是花在了你引用的一些根本没用到的dll命名空间了,影响了一部分时间。using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Diagnostics;
    using System.Data.SqlClient;
    using System.Security.Permissions;
      

  2.   

    在代码编辑窗口点右键,选择“组织Using”>“移除未使用的Using”,编译器可以自动将你没有用到的那些引用移除掉。
      

  3.   


    2.0跑的结果10-20ms
    4.0跑的结果400-500ms
    不要搞笑,using了没用到的namespace能让性能差这么多么?
      

  4.   

    2.0 5ms
    3.5 也是5ms
    4.0 没有
      

  5.   

    这不影响吧,编译器不会帮你引用你用不到的dll的,即使你using了,
      

  6.   

    不知道16楼是怎么测试的,如果几种情况的测试条件不完全相同(或十分接近)那么测试结果是没有参考意义的
    .net4.0可能会比2.0慢一些,但是3ms和543ms的差别你应该知道错多少个数量级了吧,想都不要想,肯定是你测试有问题
    【结论:你的测试本身就有问题,设计一个科学的测试方案让大家看看,不要光写两个数字,这样没意思】
      

  7.   

    bin文件夹中的没有用的dll删除掉
      

  8.   

    不用激动,.net 4.0和.net 2.0的安全机制有区别导致的,.net 4.0可能需要额外的设置,对这个不是很熟。
    我相信除了涉及这个安全机制之外的程序,不会有这样大的差别。
      

  9.   


    同样代码建2个项目,target framework分别选3.5, 4.0,其他完全一致,编译后分别执行多次,我执行结果是4.0比3.5平均慢了20多倍。你可以自己在vs2010下测试,用express edition都可以试。
      

  10.   

    用FileIOPermission和自定义的Permission测了下,只有FileIOPermission似乎和2.0差不多,4.0的CAS到底怎么回事?
      

  11.   

    把你的[SqlClientPermission(SecurityAction.Demand)]注释掉试一试!
      

  12.   

    我在开发中遵循一条XP原则,(由于采取TDD驱动开发所以)被证明为没有用的代码就应该删除掉。当我们删除(首先注释)掉一条代码,程序仍然可以通过测试验收,那么就说明这条代码应该删除
      

  13.   

    留名,关注
    看到lz在msdn也问了。
      

  14.   

    是的,一下是注释掉[SqlClientPermission(SecurityAction.Demand)]前后的比较:
    VS2008:
    3
    程序计算耗时:5 msVS2010:
    486
    程序计算耗时:488 ms

    ------------------------------注释后----------------------------

    VS2008:
    0
    程序计算耗时:3 msVS2010:
    0
    程序计算耗时:2 ms
    VS2010是重新优化后的架构,VS2008就像Vista一样,过渡版本,我平时自己开发程序只用VS2010和VS2005,VS2010开发的东西运行起来没感觉到比VS2005慢。楼主的这个例子是个别现象,比较.net4.0和.net3.5的架构差别还是挺大的,一般情况下4.0比3.5的速度要快些。using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Diagnostics;
    using System.Data.SqlClient;
    using System.Security.Permissions;namespace ConsoleApplication2
    {    //[SqlClientPermission(SecurityAction.Demand)]
        public class Class1
        {
            public void Test()
            { }
        }    class Program
        {
            static void Main(string[] args)
            {
                //程序开始执行时间
                DateTime dtBegin = DateTime.Now;            Class1 c;            Stopwatch w = new Stopwatch();
                w.Start();
                for (int i = 0; i < 10000; i++)
                {
                    c = new Class1();
                    c.Test();
                }
                w.Stop();            Console.WriteLine(w.ElapsedMilliseconds);            //计算程序运行时间(单位:ms)
                Console.WriteLine("程序计算耗时:" + (DateTime.Now - dtBegin).Milliseconds.ToString() + " ms");
                Console.Read();        }
        }
    }
      

  15.   

    估计到sp1会好一些,有不少以前靠非托管实现的,现在都是用纯.net来弄的。
    另外以前也说过的4.0里面的Biginteger用的是n^2的算法,还不如3.5里面那个用分治来做的,更不用说各种FFT了。
      

  16.   

    越看越愚昧,.net性能真的不能再大幅优化了吗?
    一直有个疑问,.net程序为什么不能把引用的程序集都拷贝到程序中,然后不用安装.net直接运行
    这样可以根据使用到的内容进行优化
      

  17.   


    那是不可能的,
    引用多余的DLL,不可能是最主要的原因, 首先你要明白, 首次执行时间慢,这个应该是可以理解的,因为他需要时间加载数据,这个时候 不同的运行库可能会有差别(而且,引用了未用的命名空间,.NET他也不会加载,只有在用到的时候才会去加载.), 但是, 第二次,第三次,我想他们应该是没有那么大的差距, 准确的说,应该是你的测试用例有问题.
      

  18.   

    SecurityAction.Demand
    要求调用堆栈中的所有高级调用方都已被授予了当前权限对象所指定的权限在安全检查过程中,运行库遍历调用堆栈,检查堆栈中每个调用方的权限,然后确定是否已将要求的权限授予每个调用方。遍历调用堆栈,跟调试差不多慢
      

  19.   


    注释掉就没意义了。2.0下有这个attribute速度根本不受影响,4.0却影响巨大。EnterpriseLibrary这个库里Sql数据库访问类就含有这个Attribute,当你把用到enterpriselibrary的web应用从2.0升级到4.0后性能会大受影响。还有就是2.0的时候如有模块使用了自定义的CAS作为权限控制那在4.0下性能也大打折扣,而且性能差这么大以后谁还敢轻易把项目从2.0迁移到4.0。
      

  20.   

     高版本的 一般来说都会比低版本的编译速度要慢一点  加了很多增加的功能 还有一些安全机制 就像sql 2008 比 sql 2008 就要慢上一点
      

  21.   

    引用没有用到的命名空间、DLL  只影响编绎速度吧 不影响运行速度的
    至于程序运行时间差别这么大` 个人认为可能是测试方法的原因有可能也跟电脑本身有关,就算是在同一台电脑上测也有关系。
      

  22.   

    跟测试方法其实也没有什么关系,因为lz给出测试代码来了。实际去测试一下,把没用的(至少从lz的代码中看来是很明显多余增加的)[SqlClientPermission(SecurityAction.Demand)]语句注释掉,就清楚了。我不知道lz为什么要加这个明显多余的语句,也许他有他的意思,但是肯定地说他是故意没有说明这个语句的意义。不需要的语句,就要删掉。
      

  23.   

    IL代码是一样的,看不出差别,循环执行100次,在.net4.0下的效果没有太大差别。
      

  24.   

    .net越强大,复杂性就越高,虽说.net4.0已经做了一定的优化,那可能只是总体上或者说某些方面,当具体应用到某一规则就不一定,看来这样的测试还真不可少。
      

  25.   

    微软不可能做退步的事情砸自己的脚,C#的效率是越来越高的,JIT也越来越强,无用的东西将会直接抛弃