一个易用,高效,精确的纳秒级C#时间计数器

我们在平时的项目中,时常会遇到这样的问题,当我们要评价一个算法的好坏时(这里指的是时间复杂度量级相同的两个算法);当我们要测试一段代码的性能时。。。我们都需要一个高精度的时间。如何来得到一个高精度的时间,而且又不影响我们的测试准确性呢?平时大家可能采用的方法是:new两个time,然后两个Time相减,得到一个TimeSpan,这样就可以得到一个毫秒级的时间(当然了,这个是一个并不精确的毫秒级时间),但是,那如果你要求的精度更好,需要达到微秒,纳秒级呢?这时候使用系统提供的Time类就不行了。

我曾经也遇到过类似的问题,于是在这里就封装了自己的Code,提供一个使用方便,高效,精确的纳秒级计时器。

我采用的方法是使用两个Win32函数来实现的:

QueryPerformanceCounter():此函数用于获取精确的性能计数器数值。

QueryPerformanceFrequency():返回硬件支持的高精度计数器的频率(你可以理解为查询CPU的主频)。
这两个函数是Win32标准库函数,我们要使用它就需要P/Invoke技术。P/Invoke技术是由微软提供的用于Native和Managed之间资源和函数互访的一项技术。在.net平台中就是DllImport。 继续阅读

exe文件双击之后(.net版)

我们知道,.net编译器在生成托管代码时会将一些重要信息写入PE文件的header和.text section(后边我会介绍这些写入程序集的重要信息是什么),本文介绍当我们双击一个托管代码写的exe程序时发生的事情。
以下说明所使用的工具是VS2005+sos.dll,示例程序代码如下: 

继续阅读

谈谈C#中垃圾回收与内存管理机制

今天抽空来讨论一下.Net的垃圾回收与内存管理机制,也算是完成上个《WCF分布式开发必备知识》系列后的一次休息吧。以前被别人面试的时候问过我GC工作原理的问题,我现在面试新人的时候偶尔也会问相关的问题。那么你是否也遇到这样的问题呢?比如你清楚.Net的垃圾回收机制吗?你能简述一下GC的工作原理吗?怎么样才能有效的管理内存呢?Using语句体内实例化的对象有什么作用?等等相关问题。下面我们就来详细讨论一下。相信你看完以后也可以面试别人。

本节的组织如下,1..Net的类型和内存分配2.GC垃圾收集器的工作原理3.什么是非托管资源4.如何有效释放对象资源。总结.现在开始我们本节的学习。 继续阅读