实际上,这与您对算法的选择有关。通常没有优化的“灵丹妙药”。
例如,使用 aStringBuilder而不是串联可以使您的代码明显更快,但需要权衡。如果您不连接大量字符串,则初始化所需的内存和时间StringBuilder会比仅使用常规连接更糟糕。整个框架中有很多这样的例子,例如您在问题中提到的字典缓存。
您一天中真正可以学习并应用于编码的唯一一般优化是装箱/拆箱(堆与堆栈)对性能的影响。为此,您需要了解它的含义以及如何避免或减少这样做的需要。
Microsoft 的 MSDN 文档有 2 篇有关性能的文章,提供了许多可用的通用技术(它们实际上只是同一文章的不同版本)。
下面我会建议
1.知道何时使用StringBuilder
您之前一定听说过,StringBuilder对象将字符串附加在一起比普通字符串类型要快得多。
The thing is StringBuilder is faster mostly with big strings. This means if you have a loop that will add to a single string for many iterations then a StringBuilder class is definitely much faster than a string type.
However if you just want to append something to a string a single time then a StringBuilder class is overkill. A simple string type variable in this case improves on resources use and readability of the C# source code.
只需在 StringBuilder 对象和字符串类型之间正确选择,您就可以优化代码。
2. 比较不区分大小写的字符串
在应用程序中有时需要比较两个字符串变量,忽略大小写。诱人的传统方法是将两个字符串都转换为全部小写或全部大写,然后比较它们,如下所示:
str1.ToLower() == str2.ToLower()
然而,重复调用函数 ToLower() 是性能瓶颈。通过使用内置的 string.Compare() 函数,您可以提高应用程序的速度。
要检查两个字符串是否相等,忽略大小写,如下所示:
string.Compare(str1, str2, true) == 0 //Ignoring cases
当两个字符串相等时,C# string.Compare 函数返回一个等于 0 的整数。
3.使用string.Empty
与其说这是性能改进,不如说是可读性改进,但它仍然算作代码优化。尝试替换如下行:
if (str == "")
和:
if (str == string.Empty)
这只是更好的编程实践,并且对性能没有负面影响。
请注意,有一种流行的做法,即检查字符串的长度是否为 0 比将其与空字符串进行比较要快。然而,一旦它不再是显着的性能改进,这可能是正确的。相反,坚持使用 string.Empty。
4. 用List<>替换ArrayList
当在同一列表中存储多种类型的对象时,ArrayList 非常有用。但是,如果您在一个 ArrayList 中保留相同类型的变量,则可以通过使用 List<> 对象来提高性能。
采用以下 ArrayList:
ArrayList intList = new ArrayList();
intList.add(10);
return (int)intList[0] + 20;
Run Code Online (Sandbox Code Playgroud)
请注意,它仅包含整数。使用 List<> 类要好得多。要将其转换为类型化列表,只需更改变量类型:
List<int> intList = new List<int>();
intList.add(10)
return intList[0] + 20;
Run Code Online (Sandbox Code Playgroud)
无需使用 List<> 进行类型转换。对于整数等基本数据类型,性能提升尤其显着。
5.使用&&和|| 运营商
构建 if 语句时,只需确保使用双与符号 (&&) 和/或双或符号 (||)(在 Visual Basic 中它们是 AndAlso 和 OrElse)。
使用 & 和 | 的 If 语句 必须检查陈述的每个部分,然后应用“和”或“或”。另一方面,&& 和 || 一次仔细检查一个语句,一旦条件满足或不满足就停止。
执行较少的代码始终会带来性能优势,但也可以避免运行时错误,请考虑以下 C# 代码:
if (object1 != null && object1.runMethod())
Run Code Online (Sandbox Code Playgroud)
如果object1为null,使用&&运算符,object1.runMethod()将不会执行。如果 && 运算符替换为 &,即使 object1 已知为 null,object1.runMethod() 也会运行,从而导致异常。
6. 智能尝试捕捉
Try-Catch 语句旨在捕获程序员无法控制的异常,例如连接到网络或设备。使用 try 语句来保持代码“简单”,而不是使用 if 语句来避免容易出错的调用,这会使代码变得非常慢。重构源代码以减少 try 语句的数量。
7. 更换部门
C# 在除法运算方面相对较慢。一种替代方法是用乘法移位运算代替除法,以进一步优化 C#。文章详细解释了如何进行转换。
确实取决于很多事情。
举个例子,当内存成为问题并且创建大量临时对象时,我倾向于使用对象池。(拥有垃圾收集器并不是不处理内存分配的理由)。如果速度很重要,那么我可能会使用不安全的指针来处理数组。
无论哪种方式,如果您发现自己在 ac#/.net 应用程序中的优化技术方面遇到了太多困难,那么您可能选择了错误的语言/平台。
| 归档时间: |
|
| 查看次数: |
10365 次 |
| 最近记录: |