Web Analytics
yangyang

码农兼一个普普通通小青年

DotNet Framework


减少.NET应用程序内存占用的一则实践

最近一周比较忙,主要的工作内容是在做一个叫“键盘精灵”的东西,简单来讲就是将很多数据放到内存中,对这些数据进行快速检索,然后找出根据输入条件最匹配的10条记录并予以展示。具体和下面两款炒股软件的相关功能类似: 数据以文本形式存在文件中,且数据量较大,有近20万条,每一条记录有几个字段,以分隔符分割。当时使用的是6万条记录的测试数据,文本文件将近10M,这个模块加载到内存并建立缓存之后,大概会占用将近70-80M的内存。自我接手以后,主要的任务就是降低内存消耗和提高匹配效率。 一、避免创建不必要的对象 拿到代码后,第一步就是看设计文档,然后断点一步一步的看代码,大概明白了逻辑之后,发现思路有一些问题。之前的代码处理流程思路大概是下面这样的: 将文件读取到内存,实例化 根据条件对文件进行检索,并存储到结果集1中 对结果集 …

.NET C# Performance Optimizing

浅析.NET中的引用类型和值类型(下)

上一篇文章中简单讲了.NET中值类型和引用类型的区别,并分析了引用类型的内存布局和实现方式,并在开始的例子中简单分析了值类型相较于引用类型的若干优点。在平常的开发中,很多人一上来就用class,而很少去想到底该用class还是struct。本文详细介绍.NET中的值类型以及在使用中应该注意的问题。在某些情况下,使用值类型较引用类型可以显著减少内存占用和GC压力,提高程序的执行效率。本文参考《Pro .NET Performance》 《CLR Via C#》和 《Advanced .NET Debugging》,希望对您有帮助。 值类型内部实现 和引用类型相比,值类型具有相对简单的内存布局,但是这种简单的布局也引入了一些限制,尤其是在要将值类型“当做”引用类型使用的时候需要进行装箱操作。 上篇文章提到,使用值类型最主要的原因是:值类型具 …

.NET Performance Optimizing

浅析.NET中的引用类型和值类型(上)

.NET中的类型分为值类型和引用类型,他们在内存布局,分配,相等性,赋值,存储以及一些其他的特性上有很多不同,这些不同将会直接影响到我们应用程序的效率。本文视图对.NET 基础类型中的值类型和引用类型在内存中的布局,方法的调用,值类型如何实现接口,以及其他一些细节问题进行一些简要的讨论,文章主要参考《Pro .NET Performance》 和 《Advanced .NET Debugging》 ,希望给大家一点儿帮助。 一 简单例子 举一个简单的例子,我们有一个名为Point2D的对象,用来表示二维空间中的坐标,每一个坐标值x,y都用一个short类型表示,整个对象占4个字节。现在假设我们需要在内存中存储1000万个这样的坐标点集合对象。那么他们会占用多大内存呢?这个问题的答案其实在很大程度上依赖Point2D是值类型还是引用类型。如果他是引用类型,10 …

Method Table Sync Block

程序集的混淆及签名

一般地,用.NET编写的程序集在发布前,通常需要对代码进行混淆和强签名,下面简要介绍一下程序集的混淆和强签名的步骤及在实际开发中的实施。 1.创建一个公钥/私钥对 首先,需要创建一个公钥/私钥对。密钥如果有密码保护,则生成pfx文件,没有密码生成snk文件,pfx比snk文件较大些,在Visual Studio命令提示符下: Sn -k Certify.snk 该.snk文件应该由专门人员用专门设备保存起来。 然后,运用如下命令,从该公私密钥对中,提取出公钥,公钥发给每一个开发人员。 sn -p Certify.snk Certify.public.snk 2.创建一个控制台应用程序 为了掩饰如何对程序进行签名和混淆,首先创建一个控制台应用程序,名为Sign.exe,为了更好地说明签名及混淆前后代码的变化,我们使用ILDASM来查 …

Assembly Obfuscation

.NET中的Lambda表达式与匿名方法

在C#2中,由于有了方法组,匿名方法,类型的协变和抗变,使得运用delegate变得很容易,在注册事件时代码变得简单易读,但是在C# 2中,代码仍然有点臃肿,大块的匿名方法会降低代码的可读性,一般我们不会在一条语句中写多个匿名方法。 LINQ产生的一个目的是能够方便的对数据进行管道操作而不失语义。LINQ能够表达对数据进行的各种逻辑操作,LINQ执行时,这些操作实际上都是通过委托来实现的。使用LINQ to Object操作数据时,一条语句中包含多个委托是很常见的,C# 3中的Lambda表达式正式这幕后的功臣,它不仅使得我们能够在一条代码中写多个委托,而且不会丧失代码的可读性。相信用过LINQ的人应该都有这样的体会。 在很多方面Lambda表达式可以看成是C#2中匿名方法的演变。他们俩的功能是一样的,都使得代码更加清晰和紧凑。另外,Lambda表达 …

Lambda Expression Anonymous Method Delegate

详解C# 迭代器

迭代器模式是设计模式中行为模式(behavioral pattern)的一个例子,他是一种简化对象间通讯的模式,也是一种非常容易理解和使用的模式。简单来说,迭代器模式使得你能够获取到序列中的所有元素而不用关心是其类型是array,list,linked list或者是其他什么序列结构。这一点使得能够非常高效的构建数据处理通道(data pipeline)--即数据能够进入处理通道,进行一系列的变换,或者过滤,然后得到结果。事实上,这正是LINQ的核心模式。 在.NET中,迭代器模式被IEnumerator和IEnumerable及其对应的泛型接口所封装。如果一个类实现了IEnumerable接口,那么就能够被迭代;调用GetEnumerator方法将返回IEnumerator接口的实现,它就是迭代器本身。迭代器类似数据库中的游标,他是数据序列中的一个位置记录。迭代器只能向 …

.NET C#

查询表达式与循环控制

For,do… while,while ,foreach是大多数编程语言中常用的循环控制语句,在C#中查询表达式也能实现同样的效果。 查询表达式使得编程风格从”命令式”变得更加的”声明式”。查询表达式定义想要的结果以及要达到该结果需要执行的方法,而不是具体的如何实现。这里重点是查询表达式,通过扩展方法,查询表达式使得能够比命令式循环构造更能够清楚的表达意图。 下面的语句显示了一个命令式风格的填充一个数组并打印到控制台上: int[] foo = new int[100]; for (int num = 0; num < foo.Length; num++) { foo[num] = num * num; } foreach (int i in foo) { …

.NET C#