|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
刚刚打开这篇专题,猛然见到HAL9000发表的《对于大型公司项目平台选择j2ee的几层认识》系列,深受启发。1、数据库会见功能优化
数据库的毗连和封闭
会见数据库资本必要创立毗连、翻开毗连和封闭毗连几个操纵。这些历程必要屡次与数据库互换信息以经由过程身份考证,对照泯灭服务器资本。ASP.NET中供应了毗连池(ConnectionPool)改良翻开和封闭数据库对功能的影响。体系将用户的数据库毗连放在毗连池中,必要时掏出,封闭时发出毗连,守候下一次的毗连哀求。
毗连池的巨细是无限的,假如在毗连池到达最年夜限制后仍请求创立毗连,一定年夜年夜影响功能。因而,在创建数据库毗连后只要在真正必要操纵时才翻开毗连,利用终了后即刻封闭,从而只管削减数据库毗连翻开的工夫,制止呈现超越毗连限定的情形。
利用存储历程
存储历程是存储在服务器上的一组预编译的SQL语句,相似于DOS体系中的批处置文件。存储历程具有对数据库当即会见的功效,信息处置极其敏捷。利用存储历程能够制止对命令的屡次编译,在实行一次后其实行计划就驻留在高速缓存中,今后必要时只需间接挪用缓存中的二进制代码便可。
别的,存储历程在服务器端运转,自力于ASP.NET程序,便于修正,最主要的是它能够削减数据库操纵语句在收集中的传输。
优化查询语句
ASP.NET中ADO毗连损耗的资本相称年夜,SQL语句运转的工夫越长,占用体系资本的工夫也越长。因而,只管利用优化过的SQL语句以削减实行工夫。好比,不在查询语句中包括子查询语句,充实使用索引等。
2、字符串操纵功能优化
利用值范例的ToString办法
在毗连字符串时,常常利用“+”号间接将数字增加到字符串中。这类办法固然复杂,也能够失掉准确了局,可是因为触及到分歧的数据范例,数字必要经由过程装箱操纵转化为援用范例才能够增加到字符串中。可是装箱操纵对功能影响较年夜,由于在举行这类处置时,将在托管堆平分配一个新的工具,原本的值复制到新创立的工具中。
利用值范例的ToString办法能够制止装箱操纵,从而进步使用程序功能。
使用StringBuilder类
String类工具是不成改动的,关于String工具的从头赋值在实质上是从头创立了一个String工具并将新值付与该工具,其办法ToString对功能的进步并不是很明显。
在处置字符串时,最好利用StringBuilder类,其.NET定名空间是System.Text。该类并不是创立新的工具,而是经由过程Append,Remove,Insert等办法间接对字符串举行操纵,经由过程ToString办法前往操纵了局。
其界说及操纵语句以下所示:
intnum;
System.Text.StringBuilderstr=newSystem.Text.StringBuilder();//创立字符串str.Append(num.ToString());//增加数值num
Response.Write(str.ToString);//显现操纵了局
3、优化Web服务器盘算机和特定使用程序的设置文件以切合您的特定必要
默许情形下,ASP.NET设置被设置成启用最普遍的功效并只管顺应最多见的计划。因而,使用程序开辟职员能够依据使用程序所利用的功效,优化和变动个中的某些设置,以进步使用程序的功能。上面的列表是您应当思索的一些选项。
仅对必要的使用程序启用身份考证。默许情形下,身份考证形式为Windows,或集成NTLM。年夜多半情形下,关于必要身份考证的使用程序,最幸亏Machine.config文件中禁用身份考证,并在Web.config文件中启用身份考证。
依据得当的哀求和呼应编码设置来设置使用程序。ASP.NET默许编码格局为UTF-8。假如您的使用程序为严厉的ASCII,请设置使用程序利用ASCII以取得稍许的功能进步。
思索对使用程序禁用AutoEventWireup。在Machine.config文件中将AutoEventWireup属性设置为false,意味着页面不将办法名与事务举行婚配和将二者挂钩(比方Page_Load)。假如页面开辟职员要利用这些事务,必要在基类中重写这些办法(比方,必要为页面加载事务重写Page.OnLoad,而不是利用Page_Load办法)。假如禁用AutoEventWireup,页面将经由过程将事务毗连留给页面作者而不是主动实行它,取得稍许的功能提拔。
从哀求处置管线中移除不必的模块。默许情形下,服务器盘算机的Machine.config文件中节点的一切功效均保存为激活。依据使用程序所利用的功效,您能够从哀求管线中移除不必的模块以取得稍许的功能提拔。反省每一个模块及其功效,并按您的必要自界说它。
比方,假如您在使用程序中不利用会话形态和输入缓存,则能够从列表中移除它们,以便哀求在不实行其他成心义的处置时,不用实行每一个模块的进进和分开代码。
4、必定要禁用调试形式
在部署临盆使用程序或举行任何功能丈量之前,一直记着禁用调试形式。假如启用了调试形式,使用程序的功能大概遭到十分年夜的影响。
5、关于普遍依附内部资本的使用程序,请思索在多处置器盘算机上启用收集园艺
ASP.NET历程模子匡助启用多处置器盘算机上的可缩放性,将事情分发给多个历程(每一个CPU一个),而且每一个历程都将处置器干系设置为其CPU。此手艺称为收集园艺。假如使用程序利用较慢的数据库服务器或挪用具有内部依附项的COM工具(这里只是说起两种大概性),则为您的使用程序启用收集园艺是无益的。可是,在决意启用收集园艺之前,您应当测试使用程序在收集园中的实行情形。
6、只需大概,就缓存数据和页输入
ASP.NET供应了一些复杂的机制,它们会在不必要为每一个页哀求静态盘算页输入或数据时缓存这些页输入或数据。别的,经由过程计划要举行缓存的页和数据哀求(出格是在站点中预期将有较年夜通信量的地区),能够优化这些页的功能。与.NETFramework的任何Web窗体功效比拟,得当地利用缓存能够更好的进步站点的功能,偶然这类进步是超数目级的。
利用ASP.NET缓存机制有两点必要注重。起首,不要缓存太多项。缓存每一个项均有开支,出格是在内存利用方面。不要缓存简单从头盘算和很少利用的项。其次,给缓存的项分派的无效期不要太短。很快到期的项会招致缓存中不用要的周转,而且常常招致更多的代码扫除和渣滓接纳事情。若体贴此成绩,请监督与ASP.NETApplications功能工具联系关系的CacheTotalTurnoverRate功能计数器。高周转率大概申明存在成绩,出格是当项在到期前被移除时。这也称作内存压力。
7、选择合适页面或使用程序的数据检察机制
依据您选择在Web窗体页显现数据的体例,在便当和功能之间经常存在侧重要的衡量。比方,DataGridWeb服务器控件多是一种显现数据的便利快速的办法,但就功能而言它的开支经常是最年夜的。在某些复杂的情形下,您经由过程天生得当的HTML本人出现数据大概很无效,可是自界说和扫瞄器定向会很快抵销所取得的分外功能。RepeaterWeb服务器控件是便当和功能的折中。它高效、可自界说且可编程。
8、将SqlDataReader类用于疾速只进数据游标
SqlDataReader类供应了一种读取从SQLServer数据库检索的只进数据流的办法。假如当创立ASP.NET使用程序时呈现同意您利用它的情形,则SqlDataReader类供应比DataSet类更高的功能。情形之以是如许,是由于SqlDataReader利用SQLServer的本机收集数据传输格局从数据库毗连间接读取数据。别的,SqlDataReader类完成IEnumerable接口,该接口也同意您将数据绑定到服务器控件。有关更多信息,请拜见SqlDataReader类。有关ASP.NET怎样会见数据的信息,请拜见经由过程ASP.NET会见数据。
9、将SQLServer存储历程用于数据会见
在.NETFramework供应的一切数据会见办法中,基于SQLServer的数据会见是天生高功能、可缩放Web使用程序的保举选择。利用托管SQLServer供应程序时,可经由过程利用编译的存储历程而不是特别查询取得分外的功能进步。
10、制止单线程单位(STA)COM组件
默许情形下,ASP.NET不同意任何STACOM组件在页面内运转。若要运转它们,必需在.aspx文件内将ASPCompat=true属性包括在@Page指令中。如许就将实行用的线程池切换到STA线程池,并且使HttpContext和其他内置工具可用于COM工具。前者也是一种功能优化,由于它制止了将多线程单位(MTA)封送到STA线程的任何挪用。
利用STACOM组件大概年夜年夜伤害功能,应只管制止。若必需利用STACOM组件,如在任何interop计划中,则应在实行时代举行大批挪用并在每次挪用时代发送尽量多的信息。别的,当心不要在机关页面时代创立任何STACOM组件。比方上面的代码中,在页面机关时将实例化由某个线程创立的MySTAComponent,而该线程并非将运转页面的STA线程。这大概对功能有倒霉影响,由于要机关页面就必需完成MTA和STA线程之间的封送处置。
<%@PageLanguage="VB"ASPCompat="true"%>
<scriptrunat=server>
DimmyCompasnewMySTAComponent()
PublicSubPage_Load()
myComp.Name="Bob"
EndSub
</script>
<html>
<%Response.Write(myComp.SayHello)%>
</html>
首选机制是推延工具的创立,直到今后在STA线程下实行上述代码,以下面的例子所示。
<%@PageLanguage="VB"ASPCompat="true"%>
<scriptrunat=server>
DimmyComp
PublicSubPage_Load()
myComp=newMySTAComponent()
myComp.Name="Bob"
EndSub
</script>
<html>
<%Response.Write(myComp.SayHello)%>
</html>
保举的做法是在必要时大概在Page_Load办法中机关任何COM组件和内部资本。
永久不要将任何STACOM组件存储在能够由机关它的线程之外的其他线程会见的共享资本里。这类资本包含像缓存和会话形态如许的资本。即便STA线程挪用STACOM组件,也只要机关此STACOM组件的线程可以实践为该挪用服务,而这请求封送处置对创立者线程的挪用。此封送处置大概发生严重的功能丧失和可伸缩性成绩。在这类情形下,请研讨一下使COM组件成为MTACOM组件的大概性,大概更好的举措是迁徙代码以使工具成为托管工具。
11、将挪用麋集型的COM组件迁徙到托管代码
.NETFramework供应了一个复杂的办法与传统的COM组件举行交互。其长处是能够在保存现有投资的同时使用新的平台。可是在某些情形下,保存旧组件的功能开支使得将组件迁徙到托管代码是值得的。每情形都是纷歧样的,决意是不是必要迁徙组件的最好办法是对Web站点运转功能丈量。倡议您研讨一下怎样将必要大批挪用以举行交互的任何COM组件迁徙到托管代码。
很多情形下不成能将新式组件迁徙到托管代码,出格是在最后迁徙Web使用程序时。在这类情形下,最年夜的功能停滞之一是将数据从非托管情况封送到托管情况。因而,在交互操纵中,请在任何一端实行尽量多的义务,然落后行一个年夜挪用而不是一系列小挪用。比方,大众言语运转库中的一切字符串都是Unicode的,以是应在挪用托管代码之前将组件中的一切字符串转换成Unicode格局。
别的,一处置完任何COM工具或本机资本就开释它们。如许,其他哀求就可以够利用它们,而且最年夜限制地削减了因稍后哀求渣滓接纳器开释它们所引发的功能成绩。
12、在VisualBasic.NET或JScript代码中利用初期绑定
以往,开辟职员喜好利用VisualBasic、VBScript和JScript的缘故原由之一就是它们所谓“无范例”的性子。变量不必要显式范例声明,并可以复杂地经由过程利用来创立它们。当从一个范例到另外一个范例举行分派时,转换将主动实行。不外,这类便当会年夜年夜伤害使用程序的功能。
VisualBasic如今经由过程利用OptionStrict编译器指令来撑持范例平安编程。为了向后兼容,默许情形下,ASP.NET不启用该选项。可是,为了失掉最好功能,激烈倡议在页中启用该选项。若要启用OptionStrict,请将Strict属性包含在@Page指令中,大概,关于用户控件,请将该属性包含在@Control指令中。上面的示例演示了怎样设置该属性,并举行了四个变量挪用以显现利用该属性是怎样招致编译器毛病的。
<%@PageLanguage="VB"Strict="true"%>
<%DimB
DimCAsString
Thiswillcauseacompilererror.
A="Hello"
Thiswillcauseacompilererror.
B="World"
Thiswillnotcauseacompilererror.
C="!!!!!!"
Butthiswillcauseacompilererror.
C=0%>
JScript.NET也撑持无范例编程,但它不供应强迫初期绑定的编译器指令。若产生上面任何一种情形,则变量是早期绑定的:
◆被显式声明为Object。
◆无范例声明的类的字段。
◆无显式范例声明的公用函数或办法成员,而且没法从其利用揣度出范例。
◆最初一个不同对照庞大,由于假如JScript.NET编译器能够依据变量的利用情形揣度出范例,它就会举行优化。鄙人面的示例中,变量A是初期绑定的,但变量B是早期绑定的。
varA;
varB;
A="Hello";
B="World";
B=0;
为了取得最好的功能,当声明JScript.NET变量时,请为其分派一个范例。比方,varA:String。
13、使哀求管线内的一切模块尽量高效
哀求管线内的一切模块在每次哀求中都无机会被运转。因而,当哀求进进和分开模块时疾速地触发代码相当主要,出格是在不利用模块功效的代码路径里。分离在利用及不利用模块和设置文件时实行吞吐量测试,对断定这些办法的实行速率十分有效。
14、利用HttpServerUtility.Transfer办法在统一使用程序的页面间重定向
接纳Server.Transfer语法,在页面中利用该办法可制止不用要的客户端重定向。
15、需要时调剂使用程序每一个帮助历程的线程数
ASP.NET的哀求布局试图在实行哀求的线程数和可用资本之间到达一种均衡。已知一个利用充足CPU功率的使用程序,该布局将依据可用于哀求的CPU功率,来决意同意同时实行的哀求数。这项手艺称作线程门控。可是在某些前提下,线程门控算法不是很无效。经由过程利用与ASP.NETApplications功能工具联系关系的PipelineInstanceCount功能计数器,能够在PerfMon中监督线程门控。
当页面挪用内部资本,如数据库会见或XMLWebservices哀求时,页面哀求一般中断并开释CPU。假如某个哀求正在守候被处置,而且线程池中有一个线程是自在的,那末这个正在守候的哀求将入手下手被处置。遗憾的是,偶然这大概招致Web服务器上存在大批同时处置的哀求和很多正在守候的线程,而它们对服务器功能有倒霉影响。一般,假如门控因子是内部资本的呼应工夫,则让过量哀求守候资本,对Web服务器的吞吐量并没有匡助。
为和缓这类情形,能够经由过程变动Machine.config设置文件节点的maxWorkerThreads和maxIOThreads属性,手动设置历程中的线程数限定。
注重帮助线程是用来处置ASP.NET哀求的,而IO线程则是用于为来自文件、数据库或XMLWebservices的数据供应服务的。
分派给这些属性的值是历程中每一个CPU每类线程的最年夜数量。关于双处置器盘算机,最年夜数是设置值的两倍。关于到处理器盘算机,最年夜值是设置值的四倍。不管怎样,关于有四个或八个CPU的盘算机,最好变动默许值。关于有一个或两个处置器的盘算机,默许值就能够,但关于有更多处置器的盘算机的功能,历程中有一百或两百个线程则弊年夜于利。
注重历程中有太多线程常常会下降服务器的速率,由于分外的高低文互换招致操纵体系将CPU周期花在保护线程而不是处置哀求上。
16、得当地利用大众言语运转库的渣滓接纳器和主动内存办理
当心不要给每一个哀求分派过量内存,由于如许渣滓接纳器将必需更频仍地举行更多的事情。别的,不要让不用要的指针指向工具,由于它们将使工具坚持举动形态,而且应只管制止含Finalize办法的工具,由于它们在前面会招致更多的事情。出格是在Finalize挪用中永久不要开释资本,由于资本在被渣滓接纳器接纳之前大概一向损耗着内存。最初这个成绩常常会对Web服务器情况的功能形成扑灭性的冲击,由于在守候Finalize运转时,很简单耗尽某个特定的资本。
17、假如有年夜型Web使用程序,可思索实行预批编译
每当产生对目次的第一次哀求时城市实行批编译。假如目次中的页面没有被剖析并编译,此功效会成批剖析并编译目次中的一切页面,以便更好天时用磁盘和内存。假如这必要很长工夫,则将疾速剖析并编译单个页面,以便哀求能被处置。此功效带给ASP.NET功能上的优点,由于它将很多页面编译为单个程序集。从已加载的程序集会见一页比每页加载新的程序集要快。
批编译的弱点在于:假如服务器吸收到很多对还没有编译的页面的哀求,那末当Web服务器剖析并编译它们时,功能大概较差。为办理这个成绩,能够实行预批编译。为此,只需在使用程序激活之前向它哀求一个页面,不管哪页都可。然后,当用户初次会见您的站点时,页面及其程序集将已被编译。
没有复杂的机制能够晓得批编译什么时候产生。需一向比及CPU余暇大概没有更多的编译器历程(比方csc.exe(C#编译器)或vbc.exe(VisualBasic编译器))启动。
还应只管制止变动使用程序的/bin目次中的程序集。变动页面会招致从头剖析和编译该页,而交换/bin目次中的程序集则会招致完整从头批编译该目次。
在包括很多页面的年夜范围站点上,更好的举措多是依据企图交换页面或程序集的频仍水平来计划分歧的目次布局。不常变动的页面能够存储在统一目次中并在特定的工夫举行预批编译。常常变动的页面应在它们本人的目次中(每一个目次最多几百页)以便疾速编译。
Web使用程序能够包括很多子目次。批编译产生在目次级,而不是使用程序级。
18、不要依附代码中的非常
由于非常年夜年夜地下降功能,以是您不该该将它们用作把持一般程序流程的体例。假如有大概检测到代码中大概招致非常的形态,请实行这类操纵。不要在处置该形态之前捕捉非常自己。罕见的计划包含:反省null,分派给将剖析为数字值的String一个值,或在使用数学运算前反省特定值。上面的示例演示大概招致非常的代码和测试是不是存在某种形态的代码。二者发生不异的了局。
try
{result=100/num;}
catch(Exceptione)
{result=0;}
//...tothis.
if(num!=0)
result=100/num;
elseresult=0;
19、利用HttpResponse.Write办法举行字符串串连
该办法供应十分无效的缓冲和毗连服务。可是,假如您正在实行普遍的毗连,请利用多个Response.Write挪用。上面示例中显现的手艺比用对Response.Write办法的单个挪用毗连字符串更快。
Response.Write("a");
Response.Write(myString);
Response.Write("b");
Response.Write(myObj.ToString());
Response.Write("c");
Response.Write(myString2);
Response.Write("d");
20、除非有特别的缘故原由要封闭缓冲,不然使其坚持翻开
禁用Web窗体页的缓冲会招致大批的功能开支。
21、只在需要时保留服务器控件视图形态
主动视图形态办理是服务器控件的功效,该功效使服务器控件能够在往复历程上从头添补它们的属性值(您不必要编写任何代码)。可是,由于服务器控件的视图形态在埋没的窗体字段中往复于服务器,以是该功效的确会对功能发生影响。您应当晓得在哪些情形下视图形态会有所匡助,在哪些情形下它影响页的功能。比方,假如您将服务器控件绑定到每一个往复历程上的数据,则将用从数据绑定操纵取得的新值交换保留的视图形态。在这类情形下,禁用视图形态能够节俭处置工夫。
默许情形下,为一切服务器控件启用视图形态。若要禁用视图形态,请将控件的EnableViewState属性设置为false,以下面的DataGrid服务器控件示例所示。
<asp:datagridEnableViewState="false"datasource="..."runat="server"/>
您还可使用@Page指令禁用全部页的视图形态。当您不从页回发到服务器时,这将非常有效:
<%@PageEnableViewState="false"%>
注重@Control指令中也撑持EnableViewState属性,该指令同意您把持是不是为用户控件启用视图形态。
若要剖析页上服务器控件利用的视图形态的数目,请(经由过程将trace="true"属性包含在@Page指令中)启用该页的跟踪并检察ControlHierarchy表的Viewstate列。有关跟踪和怎样启用它的信息,请拜见ASP.NET跟踪。
22、制止到服务器的不用要的往复历程
固然您极可能但愿只管多地利用Web窗体页框架的那些节俭工夫和代码的功效,但在某些情形下却不宜利用ASP.NET服务器控件和回发事务处置。
一般,只要在检索或存储数据时,您才必要启动到服务器的往复历程。多半数据操纵可在这些往复历程间的客户端长进行。比方,从HTML窗体考证用户输出常常可在数据提交到服务器之前在客户端举行。一般,假如不必要将信息传送到服务器以将其存储在数据库中,那末您不该该编写招致往复历程的代码。
假如您开辟自界说服务器控件,请思索让它们为撑持ECMAScript的扫瞄器出现客户端代码。经由过程以这类体例利用服务器控件,您能够明显地削减信息被不用要的发送到Web服务器的次数。
利用Page.IsPostBack制止对往复历程实行不用要的处置
假如您编写处置服务器控件回发处置的代码,偶然大概必要在初次哀求页时实行其他代码,而不是当用户发送包括在该页中的HTML窗体时实行的代码。依据该页是不是是呼应服务器控件事务天生的,利用Page.IsPostBack属性有前提地实行代码。比方,上面的代码演示怎样创立数据库毗连和命令,该命令在初次哀求该页时将数据绑定到DataGrid服务器控件。
voidPage_Load(Objectsender,EventArgse)
{
//Setupaconnectionandcommandhere.
if(!Page.IsPostBack)
{
Stringquery="select*fromAuthorswhereFirstNamelike%JUSTIN%";
myCommand.Fill(ds,"Authors");
myDataGrid.DataBind();
}
}
因为每次哀求时都实行Page_Load事务,上述代码反省IsPostBack属性是不是设置为false。假如是,则实行代码。假如该属性设置为true,则不实行代码。
注重假如不运转这类反省,回发页的举动将不变动。Page_Load事务的代码在实行服务器控件事务之前实行,但只要服务器控件事务的了局才大概在输入页上出现。假如不运转该反省,仍将为Page_Load事务和该页上的任何服务器控件事务实行处置。
23、当不利用会话形态时禁用它
并非一切的使用程序或页都必要针关于详细用户的会话形态,您应当对任何不必要会话形态的使用程序或页禁用会话形态。
若要禁用页的会话形态,请将@Page指令中的EnableSessionState属性设置为false。比方:
<%@PageEnableSessionState="false"%>
注重假如页必要会见会话变量,但不盘算创立或修正它们,则将@Page指令中的EnableSessionState属性设置为ReadOnly。
还能够禁用XMLWebservices办法的会话形态。有关更多信息,请拜见利用ASP.NET和XMLWebservices客户端创立的XMLWebservices。
若要禁用使用程序的会话形态,请在使用程序Web.config文件的sessionstate设置节中将mode属性设置为off。比方:
<sessionstatemode="off"/>
24、细心选择会话形态供应程序
ASP.NET为存储使用程序的会话数据供应了三种分歧的办法:历程内会话形态、作为Windows服务的历程外会话形态和SQLServer数据库中的历程外会话形态。每种办法都有本人的长处,但历程内会话形态是迄今为止速率最快的办理计划。假如只在会话形态中存储大批易掉数据,则倡议您利用历程内供应程序。历程外办理计划次要用于跨多个处置器或多个盘算机缩放使用程序,大概用于服务器或历程从头启动时不克不及丧失数据的情形。有关更多信息,请拜见ASP.NET形态办理。
25、不利用不用要的ServerControl
ASP.net中,大批的服务器端控件便利了程序开辟,但也大概带来功能的丧失,由于用户每操纵一次服务器端控件,就发生一次与服务器真个往复历程。因而,非需要,应该少利用ServerControl。
26、ASP.NET使用程序功能测试
在对ASP.NET使用程序举行功能测试之前,应确保使用程序没有毛病,并且功效准确。详细的功能测试能够接纳以下工具举行:
WebApplicationStreesTool(WAS)是Microsoft公布的一个收费测试工具,能够从http://webtool.rte.microsoft.com/高低载。它能够摹拟成百上千个用户同时对web使用程序举行会见哀求,在服务器上构成流量负载,从而到达测试的目标,能够天生均匀TTFB、均匀TTLB等功能汇总呈报。
ApplicationCenterTest(ACT)是一个测试工具,附带于VisualStudio.NET的企业版中,是Microsoft正式撑持的web使用程序测试工具。它可以直不雅地天生图表了局,功效比WAS多,但不具有多个客户机同时测试的才能。
服务器操纵体系“办理工具”中的“功能”计数器,能够对服务器举行监测以懂得使用程序功能。实不相瞒,Java是我见过的执行效率最低的程序设计语言,前不久在CSDN论坛上有个评测,计算9999的阶乘,同样的循环算法,Java的耗时是.NET的5倍。 |
|