vb.net性能优化 vbios优化
电脑性能优化用什么语言编?
C语言那东西实在不如人意,现在vb.net很流行。最新版本是vb.net2005
成都创新互联公司是创新、创意、研发型一体的综合型网站建设公司,自成立以来公司不断探索创新,始终坚持为客户提供满意周到的服务,在本地打下了良好的口碑,在过去的十多年时间我们累计服务了上千家以及全国政企客户,如成都生料搅拌车等企业单位,完善的项目管理流程,严格把控项目进度与质量监控加上过硬的技术实力获得客户的一致夸奖。
如何用VB.NET StringBuilder优化字符串操作性能
有许多字符串操作技巧可以帮助你优化代码,以获得更好的性能。StringBuilder允许你执行重复的字符串操作,取得比手工操作更佳的性能。在本文中,我说明在VB.NET中利用StringBuilder的情况。应用StringBuilder的优点StringBuilder是一个可修改字符的缓冲器。当你不直接进行字符串操作而应用StringBuilder时,与每次重复生成一个含有修正的新字符串相比,这样可以获得更佳的性能。你不能总是希望性能得到提高,因为StringBuilder有少量的过度操作,会将指定字符串的内容复制到StringBuilder中,然后将由StringBuilder得到的结果值复制回字符串对象中。在进行二个或更多字符串操作时,我建议使用StringBuilder。(如果只有一项改变,将值复制进StringBuilder再拷贝出来并不会改善性能。)StringBuilder方法Append:允许你在缓冲器末端增加一个字符串。注意,在应用StringBuilder对象时不能使用操作符。
Insert:允许你在StringBuilder对象中增加一个字符串。(就像String.Insert一样。)
Remove:允许你从StringBuilder对象中删除一个字符串。(就像String.Remove一样。)
Replace:允许你替代StringBuilder对象的一部分。(就像String.Replace一样。)
实例在列表A的样本代码中,我建立一个字符串变量strOriginal来保存原始文本的值。我还定义StringBuilder对象BuilderStr,我将利用它对存储在srtOriginal中的文本进行字符串操作。定义BuilderStr时,我将它设定到strOriginal的值中。之后,我操作BuilderStr,给它添加一些文本(“is”,
”very”,”
important”),然后再利用Replace方法去掉”very”这个单词。(注意,在这个例子中,你使用Remove方法而非Replace方法。)最后,我用BuilderStr.ToString的值更新strOriginal,并在信息框中显示所得到的字符串。
VB 请问高手,如何让 VB 运行的速度快?
:
1. 使用整数(Integer)和长整数(Long)
提高代码运行速度最简单的方法莫过于使用正确的数据类型了。也许你不相信,但是正确地选择数据类型可以大幅度提升代码的性能。在大多数情况下,程序员可以将Single,Double和Currency类型的变量替换为Integer或Long类型的变量,因为VB处理Integer和Long的能力远远高于处理其它几种数据类型。下面是排序:
Long 最快
Integer .
Byte .
Single .
Double .
Currency 最慢
在大多数情况下,程序员选择使用Single或Double的原因是因为它们能够保存小数。但是小数也可以保存在Integer类型的变量中。例如程序中约定有三位小数,那么只需要将保存在Integer变量中的数值除以1000就可以得到结果。根据我的经验,使用Integer和Long替代Single,Double和Currency后,代码的运行速度可以提高将近10倍。
2. 避免使用变体
对于一个VB程序员来说,这是再明显不过的事情了。变体类型的变量需要16个字节的空间来保存数据,而一个整数(Integer)只需要2个字节。通常使用变体类型的目的是为了减少设计的工作量和代码量,也有的程序员图个省事而使用它。但是如果一个软件经过了严格设计和按照规范编码的话,完全可以避免使用变体类型。
在这里顺带提一句,对于Object对象也存在同样的问题。请看下面的代码:
Dim FSO
Set FSO = New Scripting.FileSystemObject
或
Dim FSO as object
Set FSO = New Scripting.FileSystemObject
上面的代码由于在申明的时候没有指定数据类型,在赋值时将浪费内存和CPU时间。正确的代码应该象下面这样:
Dim FSO as New FileSystemObject
3. 尽量避免使用属性
在平时的代码中,最常见的比较低效的代码就是在可以使用变量的情况下,反复使用属性(Property),尤其是在循环中。要知道存取变量的速度是存取属性的速度的20倍左右。下面这段代码是很多程序员在程序中会使用到的:
Dim intCon as Integer
For intCon = 0 to Ubound(SomVar())
Text1.Text = Text1.Text vbcrlf SomeVar(intCon)
Next intCon
下面这段代码的执行速度是上面代码的20倍。
Dim intCon as Integer
Dim sOutput as String
For intCon = 0 to Ubound(SomeVar())
sOutput = sOutput vbCrlf
SomeVar(intCon)
Next
Text1.Text = sOutput
同样地,像这样的代码 . . .
Do Until EOF(F)
Line Input #F, nextLine
Text1.Text = Text1.Text + nextLine
Loop
. . . 比下面的代码慢得多:
Do Until EOF(F)
Line Input #F, nextLine
bufferVar = bufferVar + nextLine
Loop
Text1.Text = bufferVar
然而,下面的代码完成了相同的功能,而且还要快:
Text1.Text = Input(F, LOF(F))
如上述,几种方法都实现了同样的任务;同时,最好的算法也是最优的。
4. 尽量使用数组,避免使用集合
除非你必须使用集合(Collection),否则你应该尽量使用数组。据测试,数组的存取速度可以达到集合的100倍。这个数字听起来有点骇人听闻,但是如果你考虑到集合是一个对象,你就会明白为什么差异会这么大。
5. 展开小的循环体
在编码的时候,有可能遇到这种情况:一个循环体只会循环2到3次,而且循环体由几行代码组成。在这种情况下,你可以把循环展开。原因是循环会占用额外的CPU时间。但是如果循环比较复杂,你就没有必要这样做了。
6. 避免使用很短的函数
和使用小的循环体相同,调用只有几行代码的函数也是不经济的--调用函数所花费的时间或许比执行函数中的代码需要更长的时间。在这种情况下,你可以把函数中的代码拷贝到原来调用函数的地方。
7. 减少对子对象的引用
在VB中,通过使用.来实现对象的引用。例如:
Form1.Text1.Text
在上面的例子中,程序引用了两个对象:Form1和Text1。利用这种方法引用效率很低。但遗憾的是,没有办法可以避免它。程序员唯一可以做就是使用With或者将用另一个对象保存子对象(Text1)。
' 使用With
With frmMain.Text1
.Text = "Learn VB"
.Alignment = 0
.Tag = "Its my life"
.BackColor = vbBlack
.ForeColor = vbWhite
End With
或者
' 使用另一个对象保存子对象
Dim txtTextBox as TextBox
Set txtTextBox = frmMain.Text1
TxtTextBox.Text = "Learn VB"
TxtTextBox.Alignment = 0
TxtTextBox.Tag = "Its my life"
TxtTextBox.BackColor = vbBlack
TxtTextBox.ForeColor = vbWhite
注意,上面提到的方法只适用于需要对一个对象的子对象进行操作的时候,下面这段代码是不正确的:
With Text1
.Text = "Learn VB"
.Alignment = 0
.Tag = "Its my life"
.BackColor = vbBlack
.ForeColor = vbWhite
End With
很不幸的是,我们常常可以在实际的代码中发现类似于上面的代码。这样做只会使代码的执行速度更慢。原因是With块编译后会形成一个分枝,会增加了额外的处理工作。
8. 检查字符串是否为空
大多数程序员在检查字符串是否为空时会使用下面的方法:
If Text1.Text = "" then
' 执行操作
End if
很不幸,进行字符串比较需要的处理量甚至比读取属性还要大。因此我建议大家使用下面的方法:
If Len(Text1.Text) = 0 then
' 执行操作
End if
9. 去除Next关键字后的变量名
在Next关键字后加上变量名会导致代码的效率下降。我也不知道为什么会这样,只是一个经验而已。不过我想很少有程序员会这样画蛇添足,毕竟大多数程序员都是惜字如金的人。
' 错误的代码
For iCount = 1 to 10
' 执行操作
Next iCount
' 正确的代码
For iCount = 1 to 10
' 执行操作
Next
10. 使用数组,而不是多个变量
当你有多个保存类似数据的变量时,可以考虑将他们用一个数组代替。在VB中,数组是最高效的数据结构之一。
11. 使用动态数组,而不是静态数组
使用动态数组对代码的执行速度不会产生太大的影响,但是在某些情况下可以节约大量的资源。
12. 销毁对象
无论编写的是什么软件,程序员都需要考虑在用户决定终止软件运行后释放软件占用的内存空间。但遗憾的是很多程序员对这一点好像并不是很在意。正确的做法是在退出程序前需要销毁程序中使用的对象。例如:
Dim FSO as New FileSystemObject
' 执行操作
' 销毁对象
Set FSO = Nothing
对于窗体,可以进行卸载:
Unload frmMain
或
Set frmMain = Nothing
13. 变长和定长字符串
从技术上来说,与变长字符串相比,定长字符串需要较少的处理时间和空间。但是定长字符串的缺点在于在很多情况下,你都需要调用Trim函数以去除字符串末的空字符,这样反而会降低代码效率。所以除非是字符串的长度不会变化,否则还是使用变长字符串。
14. 使用类模块,而不是ActiveX控件
除非ActiveX控件涉及到用户界面,否则尽量使用轻量的对象,例如类。这两者之间的效率有很大差异。
15. 使用内部对象
在涉及到使用ActiveX控件和DLL的时候,很多程序员喜欢将它们编译好,然后再加入工程中。我建议你最好不要这样做,因为从VB连接到一个外部对象需要耗费大量的CPU处理能力。每当你调用方法或存取属性的时候,都会浪费大量的系统资源。如果你有ActiveX控件或DLL的源代码,将它们作为工程的私有对象。
16. 减少模块的数量
有些人喜欢将通用的函数保存在模块中,对于这一点我表示赞同。但是在一个模块中只写上二三十行代码就有些可笑了。如果你不是非常需要模块,尽量不要使用它。这样做的原因是因为只有在模块中的函数或变量被调用时,VB才将模块加载到内存中;当VB应用程序退出时,才会从内存中卸载这些模块。如果代码中只有一个模块,VB就只会进行一次加载操作,这样代码的效率就得到了提高;反之如果代码中有多个模块,VB会进行多次加载操作,代码的效率会降低。
17. 使用对象数组
当设计用户界面时,对于同样类型的控件,程序员应该尽量使用对象数组。你可以做一个实验:在窗口上添加100个PictureBox,每个PictureBox都有不同的名称,运行程序。然后创建一个新的工程,同样在窗口上添加100个PictureBox,不过这一次使用对象数组,运行程序,你可以注意到两个程序加载时间上的差别。
18. 使用Move方法
在改变对象的位置时,有些程序员喜欢使用Width,Height,Top和Left属性。例如:
Image1.Width = 100
Image1.Height = 100
Image1.Top = 0
Image1.Left = 0
实际上这样做效率很低,因为程序修改了四个属性,而且每次修改之后,窗口都会被重绘。正确的做法是使用Move方法:
Image1.Move 0,0,100,100
19. 减少图片的使用
图片将占用大量内存,而且处理图片也需要占用很多CPU资源。在软件中,如果可能的话,可以考虑用背景色来替代图片--当然这只是从技术人员的角度出发看这个问题。
20. 使用ActiveX DLL,而不是ActiveX控件
如果你设计的ActiveX对象不涉及到用户界面,使用ActiveX DLL。
21. 使用类可以提高软件的整体性能
VB提供的机制不完全支持面向对象的设计和编码,但是VB提供了简单的类。大多数人认为使用对象将导致代码的效率降低。对于这一点我个人有些不同的意见;考察代码的效率不能纯粹从运行速度的角度出发,软件占用的资源也是需要考虑的因素之一。使用类可以帮助你在整体上提升软件的性能。
22. 尽可能使用常数
使用常数可以加快应用程序的运行,增强代码的可读性,而且易于维护。如果代码中的字符串或数字是不变的,则可把它们声明为常数。常数在编译时只处理一次,将适当的值写进代码;而变量在每次运行应用程序时都要读取当前值。
尽量使用对象浏览器中列举的内部常数,而不要自己去创建。不要担心应用程序中引用的模块包含多余的常数;多余的常数在形成 .exe 文件时被删除。
23. 用 ByVal 传递参数,而不用 ByRef
编写含参数的 Sub 或 Function 过程时,按值 (ByVal) 传递参数比按地址 (ByRef) 快。尽管 Visual Basic 中参数传递的缺省方式是按地址的 (ByRef) ,但实际上需要改变参数值的过程极少。如果过程中不需改变参数的值,就可以按值 (ByVal) 来传递,举例说明如下:
Private Sub DoSomething(ByVal strName As String, _
ByVal intAge As Integer)
24. 使用类型确定的可选参数
使用 Visual Basic 5.0 中类型确定的可选参数,可以提高 Sub 或 Function 的调用速度。Visual Basic 以前版本中的可选参数只能是 Variant 的。如果过程是按值传递参数的,正如下面的例子,16 个字节的 Variant 变量保存在堆栈中。
Private Sub DoSomething(ByVal strName As String, _
Optional ByVal vntAge As Variant, _
Optional ByVal vntWeight As Variant)
使用类型确定的可选参数,每次调用时占用的堆栈空间较少,而且传递到内存中的数据也较少:
Private Sub DoSomething(ByVal strName As String, _
Optional ByVal intAge As Integer, _
Optional ByVal intWeight As Integer)
类型确定的可选参数的访问速度比 Variant 快,而且一旦数据类型错误,编译时就显示错误信息。
25利用集合的优点
可以定义和使用对象的集合是 Visual Basic 的强大功能之一。尽管集合是非常有用的,但还要正确使用才能获得最好的效果:
使用 For Each...Next 替代 For...Next。
26. 添加集合的对象时避免使用 Before 和 After 参数。
使用键集而不用几组相同对象的数组。
集合可以用 For...Next 循环进行迭代。但采用 For Each...Next 可读性更好,而且多数情况下更快。For Each...Next 是由集合的生成器实现迭代的,所以实际的操作速度将随集合对象的不同而改变。由于 For Each...Next 的最简单的实现机理就是 For...Next 的线性迭代,因此 For Each...Next 不会比 For...Next 慢。但是,有些情况下采用了比线性迭代更复杂的实现机理,所以 For Each...Next 要快得多。
如果没有使用 Before 和 After 参数,则往集合中添加对象是非常快的。否则,Visual Basic 必须在集合中检测到其它对象后,才能添加新对象。
如果对象的类型都一样,集合或数组都可以用来管理这些对象(如果对象的类型不一样,则只能用集合)。从速度的观点看,选择何种方式取决于对象的访问方式。如果能够为每一对象分配唯一的键,则集合是访问对象的最快方式。使用键从集合中检索对象比从数组中顺序遍历对象快。当然,如果没有键而要遍历对象时,则选择数组比较好。就顺序遍历方式而言,数组比集合快。
如果对象的个数少,则数组使用的内存小,并且搜索的速度快。当对象的个数在 100 左右时,集合比数组的效率高;当然,具体的数目还有赖于微处理器的速度和可用的内存。
26. 不要用Do While Not record.EOF 语句。
例如下面的代码比较慢:
Do While Not record.EOF
'代码
record.MoveNext
Loop
下面的要快好多
Record.MoveLast
intCount=Record.RecordCount
Record.MoveFirst
For i=1 To intCount
'代码
Records.MoveNext
Next i
第二部分 编译优化
我所见过的很多VB程序员从来没有使用过编译选项,也没有试图搞清楚各个选项之间的差别。下面让我们来看一下各个选项的具体含义。
1. P-代码(伪代码)和本机代码
你可以选择将软件编译为P-代码或是本机代码。缺省选项是本机代码。那什么是P-代码和本机代码呢?
P-代码:当在VB中执行代码时,VB首先是将代码编译为P-代码,然后再解释执行编译好的P-代码。在编译环境下,使用这种代码要比本机代码快。选择P-代码后,编译时VB将伪代码放入一个EXE文件中。
本机代码:本机代码是VB6以后才推出的选项。当编译为EXE文件后,本机代码的执行速度比P-代码快。选择本机代码后,编译时VB使用机器指令生成EXE文件。
在使用本机代码进行编译时,我发现有时候会引入一些莫名其妙的错误。在编译环境中我的代码完全正确地被执行了,但是用本机代码选项生成的EXE文件却不能正确执行。通常这种情况是在卸载窗口或弹出打印窗口时发生的。我通过在代码中加入DoEvent语句解决了这个问题。当然出现这种情况的几率非常少,也许有些VB程序员从来没有遇到过,但是它的确存在。
在本机代码中还有几个选项:
a) 代码速度优化:该选项可以编译出速度较快的执行文件,但执行文件比较大。推荐使用
b) 代码大小优化:该选项可以编译出比较小的执行文件,但是以牺牲速度为代价的,不推荐使用。
c) 无优化:该选项只是将P-代码转化为本机代码,没有做任何优化。在调试代码时可以使用。
d) 针对Pentium Pro优化:虽然该项不是本机代码中的缺省选项,但是我通常会使用该选项。该选项编译出的可执行程序在Pentium Pro和Pentium 2以上的机器上可以运行得更快,而在比较老的机器上要稍稍慢一些。考虑到现在用Pentium 2都是落伍,所以推荐大家使用该选项。
e) 产生符号化调试信息:该项在编译过程中生成一些调试信息,使用户可以利用Visual C++一类的工具来调试编译好的代码。使用该选项会生成一个.pdf文件,该文件记录了可执行文件中的标志信息。当程序拥有API函数或DLL调用时,该选项还是比较有帮助的。
2. 高级优化
高级优化中的设置可以帮助你提高软件的速度,但是有时候也会引入一些错误,因此我建议大家尽量小心地使用它们。如果在代码中有比较大的循环体或者复杂的数学运算时,选中高级优化中的某些项会大幅度提升代码的性能。如果你使用了高级优化功能,我建议你严格测试编译好的文件。
a) 假定无别名:可以提高循环体中代码的执行效率,但是在如果通过变量的引用改变变量值的情况下,例如调用一个方法,变量的引用作为方法的参数,在方法中改变了变量的值的话,就会引发错误。有可能只是返回的结果错误,也有可能是导致程序中断运行的严重错误。
b) 取消数组绑定检查、取消整数溢出检查和取消浮点错误检查:在程序运行时,如果通过这些检查发现了错误,错误处理代码会处理这些错误。但是如果取消了这些检查,发生了错误程序就无法处理。只有当你确定你的代码中不会出现上面的这些错误时,你才可以使用这些选项。它们将使软件的性能得到很大的提升。
c) 允许不舍入的浮点操作:选择该选项可以是编译出来的程序更快地处理浮点操作。它唯一的缺点就是在比较两个浮点数时可能会导致不正确的结果。
d) 取消Pentium FDIV安全检查:该选项是针对一些老的Pentium芯片设置的,现在看来已经过时了。
VB.net 和C#.net 各有什么优缺点
C#.net优点:
运算符重载。不安全代码(指针和固定内存区)、 无符号整数、移位运算。
VB的优点:
即时编译、静态事件绑定、条件异常捕获、COM兼容类、宽松的类型检查和变量声明、Visual Basic Runtime库、可选参数、带参数属性、模块等语言特征、动态数组。
通过VB.NET开发好的程序绝对没有问题(包括Direct X游戏开发)。虽然VB.NET的资料少,但是只要C#支持的VB.NET都支持(大体上这样,因为都要经过MSIL中间环节。除了指针之类的VB.NET不支持C#支持,但是没有多大实际用处)。
vb.net的资料以英文资料居多(只有英文资料才有看头,中国的没有什么好资料),得看看英文水平过不过关。还有VB.NET的ide也比C#的IDE好得多,代码看得也舒服。(C#的大括号{}太烦人)。
至于VB6对C的帮助,只是理解上会容易一些,其它用处不大。有VB6的基础学VBNET会方便一些,但是并不是会VB6就会VB.NET,它们差别也不小。
扩展资料:
NET、C#和ASP.NET之间的区别 :
1、NET是一个平台,一个抽象的平台的概念。
NET 平台其本身实现的方式其实还是库,抽象层面上来看是一个平台。
基本可以理解的NET核心就是NETFramwork。
NETFramework包括两个关键组成元素:
a. CommonLanguageRuntime,公共语言运行时(CLR0)-提供内在管理,代码安全性检测等功能。
b. NETFrameworkClassLibrary,.NET 框架类库(FLC)-提供大量应用类库,提高开发效率。
学习NET Framework 是所有.NET开发人员都必须的,否则开发NET程序永远都是停留在‘外功’的招式,NETramework 是NET开发高手的‘内功’修行之一。
2、C#是一个程序设计语言,仅仅是一个语言。
程序设计语言仅仅是为了方便开发人员和计算机沟通的工具,虽然 C#语法相对 C 和 C+要多一些,但是相对来看 C#语法都比较固定,这样使用起来却都很容易。我认可一位朋友说的,C#的语法更严谨!
这里回过来看看NET和C#的关系,不得不提的是NET程序的执行过程。
C#符合NETCLR 中的公共语言运行规范。CLS:commonlanguagespecification,当然所有的NET Language 都是符合这个规范的例如:VB.NET、XAML 和 C++/CL等等。
C#需要符合NETCLS,是因为NETCLR和JAVA虚拟机类似,有一个中间语言共机器来执行。所有不同语言的.NET代码在执行前会被编译成同样的中间语言(MSIL),所以所有NET 支持语言都必须符合符合CLS 规范。
P.S:如果做.NET3.0XAML开发的朋友,可以尝试下ildasm.exe看看XAML的应用程序,会发现原来 XAML其实很简单。
3、ASP.NET是一个网站开发的技术,仅仅是.NET框架中的一个应用模型。
用微软公司ASP.NET快速入门中的一句话来解释,ASP.NET是用于生成基于Web的应用程序的内容丰富的编程框架。
ASP.net 和C#的区别:
编写asp.net通常包括两部分的代码:网页层和后台处理层,网页就是用标记语言来写的,而网页对应的后台处理程序则需要.net语言来完成,目前主要是采用c#和vb.net。
可以说整个的asp.net网站通过c#或者vb.net来实现。而c#则是ms .netframework的主要语言,可以用在网站,桌面应用等方面。可以算是一种比较流行的编程语言。
vb.net都可以用来干什么?它和java的就业前景怎么样啊?
VB6.0采用可视化的编程环境,它好学易用,运行VB6.0后,会出现如下图所示的窗口,呵呵,看起来蛮复杂的,好多的按钮、菜单、小窗口,别担心,待会儿我们会一起学习这些东东都是干什么用的。
先来解决一个小问题,怎么新建一个VB的工程呢?方法是这样的,在程序启动时出现的“新建工程”对话框中选择“标准EXE”并点击确定,就能直接新建一个工程,如果你跳过了这个对话框则也可从“文件”菜单中选择“新建工程”重新调出此对话框。
下面一起来看看VB的编程环境,虽然看起来复杂,但可以把它分为几个部分,每个部分都有自己特定的功能,这样我们就清楚多了。其实VB这是通过这样一个界面把相近或同类的功能组合在一起的,它使我们在设计程序时能方便的控制程序的方方面面。
JAVA:
◇ 创建一种面向对象的程序设计语言,而不是面向过程的语言;
◇ 提供一个解释执行的程序运行环境,是程序代码独立于平台;
◇ 吸收C和C++的优点,使程序员容易掌握;
◇ 去掉C和C++中影响程序健壮性的部分,使程序更安全,例如指针、内存申请和释放;
◇ 实现多线程,使得程序能够同时执行多个任务;
◇ 提供动态下载程序代码的机制;
◇ 提供代码校验机制以保证安全性;
Java语言的特点(1)
1. 简单、面向对象和为人所熟悉
java的简单首先体现在精简的系统上,力图用最小的系统实现足够多的功能;对硬件的要求不高,在小型的计算机上便可以良好的运行。和所有的新一代的程序设计语言一样,java也采用了面向对象技术并更加彻底,所有的java程序和applet程序均是对象,封装性实现了模块化和信息隐藏,继承性实现了代码的复用,用户可以建立自己的类库。而且java采用的是相对简单的面向对象技术,去掉了运算符重载、多继承的复杂概念,而采用了单一继承、类强制转换、多线程、引用(非指针)等方式。无用内存自动回收机制也使得程序员不必费心管理内存,是程序设计更加简单,同时大大减少了出错的可能。java语言采用了C语言中的大部分语法,熟悉C语言的程序员会发现Java语言在语法上与C语言极其相似。
2. 鲁棒并且安全
java语言在编译及运行程序时,都要进行严格的检查。作为一种强制类型语言,java在编译和连接时都进行大量的类型检查,防止不匹配问题的发生。如果引用一个非法类型、或执行一个非法类型操作,java将在解释时指出该错误。在java程序中不能采用地址计算的方法通过指针访问内存单元,大大减少了错误发生的可能性;而且java的数组并非用指针实现,这样就可以在检查中避免数组越界的发生。无用内存自动回收机制也增加了Java的鲁棒性。
作为网络语言,java必须提供足够的安全保障,并且要防止病毒的侵袭。java在运行应用程序时,严格检查其访问数据的权限,比如不允许网络上的应用程序修改本地的数据。下载到用户计算机中的字节代码在其被执行前要经过一个核实工具,一旦字节代码被核实,便由java解释器来执行,该解释器通过阻止对内存的直接访问来进一步提高java的安全性。同时java极高的鲁棒性也增强了Java的安全性。
3. 结构中立并且可以移植
网络上充满了各种不同类型的机器和操作系统,为使java程序能在网络的任何地方运行,java编译器编译生成了与体系结构无关的字节码结构文件格式。任何种类的计算机,只有在其处理器和操作系统上有java运行时环境,字节码文件就可以在该计算机上运行。即使是在单一系统的计算机上,结构中立也有非常大的作用。随着处理器结构的不断发展变化,程序员不得不编写各种版本的程序以在不同的处理器上运行,这使得开发出能够在所有平台上工作的软件集合是不可能的。而使用Java将使同一版本的应用程序可以运行在所有的平台上。
体系结构的中立也使得java系统具有可移植性。java运行时系统可以移植到不同的处理器和操作系统上,java的编译器是由java语言实现的,解释器是由Java语言和标准C语言实现的,因此可以较为方便的进行移植工作。
1.2.4 Java语言的特点(2)
4. 高性能
虽然java是解释执行的,但它仍然具有非常高的性能,在一些特定的CPU上,java字节码可以快速的转换成为机器码进行执行。而且java字节码格式的设计就是针对机器码的转换,实际转换时相当简便,自动的寄存器分配与编译器对字节码的一些优化可使之生成高质量的代码。随着java虚拟机的改进和"即时编译"(just in time)技术的出现使得Java的执行速度有了更大的提高。
5. 解释执行、多线程并且是动态的
如果你了解C语言和C++语言,可以参考下列Java与C/C++语言的比较,如果不了解C语言和C++语言,可以忽略本部分知识。
a. 全局变量
Java程序不能定义程序的全局变量,而类中的公共、静态变量就相当于这个类的全局变量。这样就使全局变量封装在类中,保证了安全性,而在C/C++语言中,由于不加封装的全局变量往往会由于使用不当而造成系统的崩溃。
b. 条件转移指令
C/C++语言中用goto语句实现无条件跳转,而Java语言没有goto语言,通过例外处理语句try、catch、finally来取代之,提高了程序的可读性,也增强了程序的鲁棒性。
c. 指针
指针是C/C++语言中最灵活,但也是最容易出错的数据类型。用指针进行内存操作往往造成不可预知的错误,而且,通过指针对内存地址进行显示类型转换后,可以类的私有成员,破坏了安全性。在java中,程序员不能进行任何指针操作,同时Java中的数组是通过类来实现的,很好的解决了数组越界这一C/C++语言中不做检查的缺点。
d. 内存管理
在C语言中,程序员使用库函数malloc()和free()来分配和释放内存,C++语言中则是运算符new和delete。再次释放已经释放的内存块或者释放未被分配的内存块,会造成系统的崩溃,而忘记释放不再使用的内存块也会逐渐耗尽系统资源。在Java中,所有的数据结构都是对象,通过运算符new分配内存并得到对象的使用权。无用内存回收机制保证了系统资源的完整,避免了内存管理不周而引起的系统崩溃。
e. 数据类型的一致性
在C/C++语言中,不同的平台上,编译器对简单的数据类型如int、float等分别分配不同的字节数。例如:int在IBM PC上为16位,在VAX-11上就为32位,导致了代码数据的不可移植。在java中,对数据类型的位数分配总是固定的,而不管是在任何的计算机平台上。因此就保证了Java数据的平台无关性和可移植性。
f. 类型转换
在C/C++语言中,可以通过指针进行任意的类型转换,不安全因素大大增加。而在Java语言中系统要对对象的处理进行严格的相容性检查,防止不安全的转换。
g. 头文件
在C/C++语言中使用头文件声明类的原型和全局变量及库函数等,在大的系统中,维护这些头文件是非常困难的。java不支持头文件,类成员的类型和访问权限都封装在一个类中,运行时系统对访问进行控制,防止非法的访问。同时,Java中用import语句与其它类进行通信,以便访问其它类的对象。
h. 结构和联合
C/C++语言中用结构和联合来表示一定的数据结构,但是由于其成员均为公有的,安全性上存在问题。Java不支持结构和联合,通过类把数据结构及对该数据的操作都封装在类里面。
i. 预处理
C/C++语言中有宏定义,而用宏定义实现的代码往往影响程序的可读性,而Java不支持宏定义
.Net课堂:ASP.NET常用的优化性能方法
数据库访问性能优化
数据库的连接和关闭
访问数据库资源需要创建连接 打开连接和关闭连接几个操作 这些过程需要多次与数据库交换信息以通过身份验证 比较耗费服务器资源 ASP NET中提供了连接池(Connection Pool)改善打开和关闭数据库对性能的影响 系统将用户的数据库连接放在连接池中 需要时取出 关闭时收回连接 等待下一次的连接请求 连接池的大小是有限的 如果在连接池达到最大限度后仍要求创建连接 必然大大影响性能 因此 在建立数据库连接后只有在真正需要操作时才打开连接 使用完毕后马上关闭 从而尽量减少数据库连接打开的时间 避免出现超出连接限制的情况
使用存储过程
存储过程是存储在服务器上的一组预编译的SQL语句 类似于DOS系统中的批处理文件 存储过程具有对数据库立即访问的功能 信息处理极为迅速 使用存储过程可以避免对命令的多次编译 在执行一次后其执行规划就驻留在高速缓存中 以后需要时只需直接调用缓存中的二进制代码即可 另外 存储过程在服务器端运行 独立于ASP NET程序 便于修改 最重要的是它可以减少数据库操作语句在网络中的传输
优化查询语句
ASP NET中ADO连接消耗的资源相当大 SQL语句运行的时间越长 占用系统资源的时间也越长 因此 尽量使用优化过的SQL语句以减少执行时间 比如 不在查询语句中包含子查询语句 充分利用索引等
字符串操作性能优化
使用值类型的ToString方法
在连接字符串时 经常使用 + 号直接将数字添加到字符串中 这种方法虽然简单 也可以得到正确结果 但是由于涉及到不同的数据类型 数字需要通过装箱操作转化为引用类型才可以添加到字符串中 但是装箱操作对性能影响较大 因为在进行这类处理时 将在托管堆中分配一个新的对象 原有的值复制到新创建的对象中 使用值类型的ToString方法可以避免装箱操作 从而提高应用程序性能
运用StringBuilder类
String类对象是不可改变的 对于String对象的重新赋值在本质上是重新创建了一个String对象并将新值赋予该对象 其方法ToString对性能的提高并非很显著 在处理字符串时 最好使用StringBuilder类 其 NET 命名空间是System Text 该类并非创建新的对象 而是通过Append Remove Insert等方法直接对字符串进行操作 通过ToString方法返回操作结果 其定义及操作语句如下所示
int num
System Text StringBuilder str = new System Text StringBuilder() //创建字符串
str Append(num ToString()) //添加数值num
Response Write(str ToString) //显示操作结果
优化 Web 服务器计算机和特定应用程序的配置文件以符合您的特定需要
默认情况下 ASP NET 配置被设置成启用最广泛的功能并尽量适应最常见的方案 因此 应用程序开发人员可以根据应用程序所使用的功能 优化和更改其中的某些配置 以提高应用程序的性能 下面的列表是您应该考虑的一些选项
仅对需要的应用程序启用身份验证
默认情况下 身份验证模式为 Windows 或集成 NTLM 大多数情况下 对于需要身份验证的应用程序 最好在 nfig 文件中禁用身份验证 并在 nfig 文件中启用身份验证 根据适当的请求和响应编码设置来配置应用程序 ASP NET 默认编码格式为 UTF 如果您的应用程序为严格的 ASCII 请配置应用程序使用 ASCII 以获得稍许的性能提高
考虑对应用程序禁用 AutoEventWireup
在 nfig 文件中将 AutoEventWireup 属性设置为 false 意味着页面不将方法名与事件进行匹配和将两者挂钩(例如 Page_Load) 如果页面开发人员要使用这些事件 需要在基类中重写这些方法(例如 需要为页面加载事件重写 Page OnLoad 而不是使用 Page_Load 方法) 如果禁用 AutoEventWireup 页面将通过将事件连接留给页面作者而不是自动执行它 获得稍许的性能提升
从请求处理管线中移除不用的模块
默认情况下 服务器计算机的 nfig 文件中 节点的所有功能均保留为激活 根据应用程序所使用的功能 您可以从请求管线中移除不用的模块以获得稍许的性能提升 检查每个模块及其功能 并按您的需要自定义它 例如 如果您在应用程序中不使用会话状态和输出缓存 则可以从 列表中移除它们 以便请求在不执行其他有意义的处理时 不必执行每个模块的进入和离开代码
一定要禁用调试模式
在部署生产应用程序或进行任何性能测量之前 始终记住禁用调试模式 如果启用了调试模式 应用程序的性能可能受到非常大的影响
对于广泛依赖外部资源的应用程序 请考虑在多处理器计算机上启用网络园艺
ASP NET 进程模型帮助启用多处理器计算机上的可缩放性 将工作分发给多个进程(每个CPU一个) 并且每个进程都将处理器关系设置为其 CPU 此技术称为网络园艺 如果应用程序使用较慢的数据库服务器或调用具有外部依赖项的 对象(这里只是提及两种可能性) 则为您的应用程序启用网络园艺是有益的 但是 在决定启用网络园艺之前 您应该测试应用程序在网络园中的执行情况
只要可能 就缓存数据和页输出
ASP NET 提供了一些简单的机制 它们会在不需要为每个页请求动态计算页输出或数据时缓存这些页输出或数据 另外 通过设计要进行缓存的页和数据请求(特别是在站点中预期将有较大通讯量的区域) 可以优化这些页的性能 与 NET Framework 的任何 Web 窗体功能相比 适当地使用缓存可以更好的提高站点的性能 有时这种提高是超数量级的 使用 ASP NET 缓存机制有两点需要注意 首先 不要缓存太多项 缓存每个项均有开销 特别是在内存使用方面 不要缓存容易重新计算和很少使用的项 其次 给缓存的项分配的有效期不要太短 很快到期的项会导致缓存中不必要的周转 并且经常导致更多的代码清除和垃圾回收工作 若关心此问题 请监视与 ASP NET Applications 性能对象关联的 Cache Total Turnover Rate 性能计数器 高周转率可能说明存在问题 特别是当项在到期前被移除时 这也称作内存压力
选择适合页面或应用程序的数据查看机制
根据您选择在 Web 窗体页显示数据的方式 在便利和性能之间常常存在着重要的权衡 例如 DataGrid Web 服务器控件可能是一种显示数据的方便快捷的方法 但就性能而言它的开销常常是最大的 在某些简单的情况下 您通过生成适当的 HTML 自己呈现数据可能很有效 但是自定义和浏览器定向会很快抵销所获得的额外功效 Repeater Web 服务器控件是便利和性能的折衷 它高效 可自定义且可编程
将 SqlDataReader 类用于快速只进数据游标
SqlDataReader 类提供了一种读取从 SQL Server 数据库检索的只进数据流的方法 如果当创建 ASP NET 应用程序时出现允许您使用它的情况 则 SqlDataReader 类提供比 DataSet 类更高的性能 情况之所以这样 是因为 SqlDataReader 使用 SQL Server 的本机网络数据传输格式从数据库连接直接读取数据 另外 SqlDataReader 类实现 IEnumerable 接口 该接口也允许您将数据绑定到服务器控件 有关更多信息 请参见 SqlDataReader 类 有关 ASP NET 如何访问数据的信息 请参见通过 ASP NET 访问数据
将 SQL Server 存储过程用于数据访问
在 NET Framework 提供的所有数据访问方法中 基于 SQL Server 的数据访问是生成高性能 可缩放 Web 应用程序的推荐选择 使用托管 SQL Server 提供程序时 可通过使用编译的存储过程而不是特殊查询获得额外的性能提高
避免单线程单元 (STA) 组件
默认情况下 ASP NET 不允许任何 STA 组件在页面内运行 若要运行它们 必须在 aspx 文件内将 ASPCompat=true 属性包含在 @ Page 指令中 这样就将执行用的线程池切换到 STA 线程池 而且使 HttpContext 和其他内置对象可用于 对象 前者也是一种性能优化 因为它避免了将多线程单元 (MTA) 封送到 STA 线程的任何调用 使用 STA 组件可能大大损害性能 应尽量避免 若必须使用 STA 组件 如在任何 interop 方案中 则应在执行期间进行大量调用并在每次调用期间发送尽可能多的信息 另外 小心不要在构造页面期间创建任何 STA 组件 例如下面的代码中 在页面构造时将实例化由某个线程创建的 MySTAComponent 而该线程并不是将运行页面的 STA 线程 这可能对性能有不利影响 因为要构造页面就必须完成 MTA 和 STA 线程之间的封送处理
<%@ Page Language= VB ASPCompat= true %>
<script runat=server>
Dim myComp as new MySTAComponent()
Public Sub Page_Load()
myComp Name = Bob
End Sub
</script>
<>
<%
Response Write(myComp SayHello)
%>Response Write(myComp SayHello)
%>
</> 首选机制是推迟对象的创建 直到以后在 STA 线程下执行上述代码 如下面的例子所示 <%@ Page Language= VB ASPCompat= true %>
<script runat=server>
Dim myComp
Public Sub Page_Load()
myComp = new MySTAComponent()
myComp Name = Bob
End Sub
</script>
<>
<%
Response Write(myComp SayHello)
%>Response Write(myComp SayHello)
%>
</> 推荐的做法是在需要时或者在 Page_Load 方法中构造任何 组件和外部资源 永远不要将任何 STA 组件存储在可以由构造它的线程以外的其他线程访问的共享资源里 这类资源包括像缓存和会话状态这样的资源 即使 STA 线程调用 STA 组件 也只有构造此 STA 组件的线程能够实际为该调用服务 而这要求封送处理对创建者线程的调用 此封送处理可能产生重大的性能损失和可伸缩性问题 在这种情况下 请研究一下使 组件成为 MTA 组件的可能性 或者更好的办法是迁移代码以使对象成为托管对象
将调用密集型的 组件迁移到托管代码
NET Framework 提供了一个简单的方法与传统的 组件进行交互 其优点是可以在保留现有投资的同时利用新的平台 但是在某些情况下 保留旧组件的性能开销使得将组件迁移到托管代码是值得的 每一情况都是不一样的 决定是否需要迁移组件的最好方法是对 Web 站点运行性能测量 建议您研究一下如何将需要大量调用以进行交互的任何 组件迁移到托管代码 许多情况下不可能将旧式组件迁移到托管代码 特别是在最初迁移 Web 应用程序时 在这种情况下 最大的性能障碍之一是将数据从非托管环境封送到托管环境 因此 在交互操作中 请在任何一端执行尽可能多的任务 然后进行一个大调用而不是一系列小调用 例如 公共语言运行库中的所有字符串都是 Unicode 的 所以应在调用托管代码之前将组件中的所有字符串转换成 Unicode 格式 另外 一处理完任何 对象或本机资源就释放它们 这样 其他请求就能够使用它们 并且最大限度地减少了因稍后请求垃圾回收器释放它们所引起的性能问题
在 Visual Basic NET 或 JScript 代码中使用早期绑定
以往 开发人员喜欢使用 Visual Basic VBScript 和 JScript 的原因之一就是它们所谓 无类型 的性质 变量不需要显式类型声明 并能够简单地通过使用来创建它们 当从一个类型到另一个类型进行分配时 转换将自动执行 不过 这种便利会大大损害应用程序的性能 Visual Basic 现在通过使用 Option Strict 编译器指令来支持类型安全编程 为了向后兼容 默认情况下 ASP NET 不启用该选项 但是 为了得到最佳性能 强烈建议在页中启用该选项 若要启用 Option Strict 请将 Strict 属性包括在 @ Page 指令中 或者 对于用户控件 请将该属性包括在 @ Control 指令中 下面的示例演示了如何设置该属性 并进行了四个变量调用以显示使用该属性是如何导致编译器错误的
<%@ Page Language= VB Strict= true %>
<%
Dim B
Dim C As String
This will cause a piler error
A = Hello
This will cause a piler error
B = World
This will not cause a piler error
C = !!!!!!
But this will cause a piler error
C =
%>Dim B
Dim C As String
This will cause a piler error
A = Hello
This will cause a piler error
B = World
This will not cause a piler error
C = !!!!!!
But this will cause a piler error
C =
% JScript NET 也支持无类型编程 但它不提供强制早期绑定的编译器指令 若发生下面任何一种情况 则变量是晚期绑定的 被显式声明为 Object 是无类型声明的类的字段 是无显式类型声明的专用函数或方法成员 并且无法从其使用推断出类型 最后一个差别比较复杂 因为如果 JScript NET 编译器可以根据变量的使用情况推断出类型 它就会进行优化 在下面的示例中 变量 A 是早期绑定的 但变量 B 是晚期绑定的
var A
var B
A = Hello
B = World
B = 为了获得最佳的性能 当声明 JScript NET 变量时 请为其分配一个类型 例如 var A String
使请求管线内的所有模块尽可能高效
lishixinzhi/Article/program/net/201311/11750
新闻名称:vb.net性能优化 vbios优化
本文网址:http://cdiso.cn/article/hpjici.html