不断的累积所遇到的优化和性能方面的问题(友情建议持续关注此文章):
优化一: 字符串
值类型和引用类型
值类型:int double char bool decimal struct enum
引用类型:string 数组 自定义类
值类型的值是存储在内存中的栈区
引用类型的值存储在内存中的堆中
内存:栈、堆、方法区
字符串是一个特殊的引用类型。
---->字符串的特点?
1、字符串是不可改变的。
2、字符串的驻留池(节省内存资源)
当我们给一个字符串进行赋值的时候,我们首先回去内存的堆中找一下是否已经存在这个值。
如果存在,则直接将这个值得引用拿过来给变量,如果不存在,则在堆中重新开辟一块新的
空间。
3、字符串可以看做是char类型的只读数组。
在引用传递的时候,如string类型,当赋值后,在堆中开辟了空间,如果不断的改变变量的值,会产生垃圾在堆中。
(优化:尽量减少对string类型的多次赋值)
sting s=string.Empty; // "" 开辟了空间 null 不开辟空间 (新建的时候可以新建 null)
面试的时候如果问:怎么证明sting是引用类型? 引用类型创建时需要赋值。
优化二: 遍历
foreach 、for循环遍历选择:
如果需要快速遍历查询选择foreach,因为foreach是一个快速的遍历器。
如果是需要改变内容的话用for循环,foreach不能改变值。
优化三: 装箱 拆箱
以下代码是否发生拆箱或者装箱?
string s="123”;
object o=n
答案是没有发生拆装箱,只是内存上的转换,发生拆装箱的前提是:两个数据类型存在着继承的关系,才有可能发生拆装箱。
int n=10;
ICimoarable i=n;
为什么不用非泛型集合ArrayList() ?(性能方面)
ArrayList list = new ArrayList();
for (int i = 0; i < 100000; i++)
{
list.Add(i);//发生了10000次的装箱操作
}
我在北京**天*科技公司曾做了一个 中科院的优化类型的项目,当时的计算速度很慢(慢到用分钟为计量单位),现在我才明白,我用了非泛型集合。
计算一下时间运行时间用Stopwatch 用时 2秒
Stopwatch sw = new Stopwatch();
sw.Start(); sw.Stop();
如果换成泛型list ---时间便相当少系统的运行时间。
//ArrayList list = new ArrayList();
List<int> list = new List<int>();
所以为了影响性能,尽量不要发生拆装箱。