下面的代码用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);
}
}
}
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);
}
}
}
using System.Collections.Generic;
using System.Linq;using System.Text;
using System.Diagnostics;
using System.Data.SqlClient;using System.Security.Permissions;
2.0跑的结果10-20ms
4.0跑的结果400-500ms
不要搞笑,using了没用到的namespace能让性能差这么多么?
3.5 也是5ms
4.0 没有
.net4.0可能会比2.0慢一些,但是3ms和543ms的差别你应该知道错多少个数量级了吧,想都不要想,肯定是你测试有问题
【结论:你的测试本身就有问题,设计一个科学的测试方案让大家看看,不要光写两个数字,这样没意思】
我相信除了涉及这个安全机制之外的程序,不会有这样大的差别。
同样代码建2个项目,target framework分别选3.5, 4.0,其他完全一致,编译后分别执行多次,我执行结果是4.0比3.5平均慢了20多倍。你可以自己在vs2010下测试,用express edition都可以试。
看到lz在msdn也问了。
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(); }
}
}
另外以前也说过的4.0里面的Biginteger用的是n^2的算法,还不如3.5里面那个用分治来做的,更不用说各种FFT了。
一直有个疑问,.net程序为什么不能把引用的程序集都拷贝到程序中,然后不用安装.net直接运行
这样可以根据使用到的内容进行优化
那是不可能的,
引用多余的DLL,不可能是最主要的原因, 首先你要明白, 首次执行时间慢,这个应该是可以理解的,因为他需要时间加载数据,这个时候 不同的运行库可能会有差别(而且,引用了未用的命名空间,.NET他也不会加载,只有在用到的时候才会去加载.), 但是, 第二次,第三次,我想他们应该是没有那么大的差距, 准确的说,应该是你的测试用例有问题.
要求调用堆栈中的所有高级调用方都已被授予了当前权限对象所指定的权限在安全检查过程中,运行库遍历调用堆栈,检查堆栈中每个调用方的权限,然后确定是否已将要求的权限授予每个调用方。遍历调用堆栈,跟调试差不多慢
注释掉就没意义了。2.0下有这个attribute速度根本不受影响,4.0却影响巨大。EnterpriseLibrary这个库里Sql数据库访问类就含有这个Attribute,当你把用到enterpriselibrary的web应用从2.0升级到4.0后性能会大受影响。还有就是2.0的时候如有模块使用了自定义的CAS作为权限控制那在4.0下性能也大打折扣,而且性能差这么大以后谁还敢轻易把项目从2.0迁移到4.0。
至于程序运行时间差别这么大` 个人认为可能是测试方法的原因有可能也跟电脑本身有关,就算是在同一台电脑上测也有关系。