.NET程序的开发人员都很喜欢通过一些计时器来看来一程序或代码的运行效率,的确这样是可以计算出代码执行所损耗的时间。但.net程序的优化不仅仅在于此.大家知道.net提供自动内存回收机制,让我们不用烦恼内存回收问题
其实很多写.NET程序的开发人员都很喜欢通过一些计时器来看来一程序或代码的运行效率,的确这样是可以计算出代码执行所损耗的时间。但.net程序的优化不仅仅在于此.大家知道.net提供自动内存回收机制,让我们不用烦恼内存回收问题;同样.net提供给我们的内存分配机制也很出色,因为它能非常快速地帮我们进行内存分配工作。当我们在享受吃糖的乐趣的时候,别忘了这东西吃多了很容易把牙齿给搞坏的;同样.net 回收内存的时候同样也让难受,当然这些情况不会在你资源充足的时候给你带来烦恼;不过一但出现他足可以让你吃不下饭。
所以优化.net程序的时候不要忘了GC这东西,解决他的办法只有一个就是分析那里产生内存,想尽办法去产生内存的地方给干了(说得有点粗爆).前段时间了解了一个对象序列化组件,测试了一下性能发现其效率真的很出色。测试代码如下:
int count = 100000; KJFObject kobj = new KJFObject(); kobj.Mm = new int[] { 34, 24, 545 }; kobj.Haha = "asfsfasfasfas"; kobj.Bind(); System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch(); sw.Start(); for (int i = 0; i < count; i++) { kobj = new KJFObject(); kobj.Mm = new int[] { 34, 24, 545 }; kobj.Haha = "asfsafsafsafasdfasfasf"; kobj.Bind(); } sw.Stop(); Console.WriteLine(sw.Elapsed.TotalMilliseconds); BufferWriter writer = new BufferWriter(Encoding.UTF8); sw.Reset(); sw.Start(); for (int i = 0; i < count; i++) { BObject bobj = new BObject(); bobj.Mm = new int[] { 34, 24, 545 }; bobj.Haha = "asfsafsafsafasdfasfasf"; writer.Reset(); bobj.Save(writer); } Console.WriteLine(sw.Elapsed.TotalMilliseconds); |
他的序列化效率比直接代码方式效率只低了50%,这50%的差距带的效果就是编写对象的时候更灵光和代码更少,这是完全可取的。其实测试结果是偏向于后者,如果细心的朋友一定发现一个问题,BufferWriter是可复用的;如果没有这种机制的情况那后者是完全输给前者的。以下是两个实体的定义:
public class KJFObject: IntellectObject { private int[] _mm; [IntellectProperty(0)] public int[] Mm { get { return _mm; } set { _mm = value; } } private string _haha; [IntellectProperty(1)] public string Haha { get { return _haha; } set { _haha = value; } } } public class BObject:IMessage { private int[] _mm; public int[] Mm { get { return _mm; } set { _mm = value; } } private string _haha; public string Haha { get { return _haha; } set { _haha = value; } } public void Load(BufferReader reader) { Mm = reader.ReadInt32s(); Haha = reader.ReadString(); } public void Save(BufferWriter writer) { writer.Write(Mm); writer.Write(Haha); } } |