Spiga

泛型缓存字典(性能之王)

2015-02-16 11:26:53

泛型缓存字典是通过静态构造函数只被执行一次的调用机制,在首次执行时存好值,后面不再计算直接调用,以达到缓存下效果。

静态构造函数:静态构造函数用于初始化任何静态数据,或执行仅需执行一次的特定操作。 将在创建第一个实例或引用任何静态成员之前自动调用静态构造函数。

说人话就是:只有该类第一次被调用时执行一次静态构造函数,该类后面再继续被调用时都不会再去执行静态构造函数。(跟踪调试发现确实这样,编译器能识别)

public class GenericCacheTest
{
	public static void Show()
	{
		for (int i = 0; i < 5; i++)
		{
			Console.WriteLine(GenericCache<int>.GetCache());
			Thread.Sleep(10);
			Console.WriteLine(GenericCache<long>.GetCache());
			Thread.Sleep(10);
			Console.WriteLine(GenericCache<DateTime>.GetCache());
			Thread.Sleep(10);
			Console.WriteLine(GenericCache<string>.GetCache());
			Thread.Sleep(10);
			Console.WriteLine(GenericCache<GenericCacheTest>.GetCache());
			Thread.Sleep(10);
		}
	}
}

/// <summary>
/// 字典缓存:
/// 原理:静态属性常驻内存,是key-value的hash存储,每次调用时需要去内存器查找要进行哈希运算
/// </summary>
public class DictionaryCache
{
	private static Dictionary<Type, string> _TypeTimeDictionary = null;
	static DictionaryCache()//静态构造函数
	{
		Console.WriteLine("This is DictionaryCache 静态构造函数");
		_TypeTimeDictionary = new Dictionary<Type, string>();
	}
	public static string GetCache<T>()
	{
		Type type = typeof(Type);
		if (!_TypeTimeDictionary.ContainsKey(type))
		{
			_TypeTimeDictionary[type] = string.Format("{0}_{1}", typeof(T).FullName, DateTime.Now.ToString("yyyyMMddHHmmss.fff"));
		}
		return _TypeTimeDictionary[type];
	}
}

/// <summary>
/// 泛型字典缓存:
/// 原理:泛型缓存则是直接被JIT编译成一个代码段,是存在寄存器(寄存器是CPU内部用来存放数据的一些小型存储区域),
/// 这个代码段又有静态缓存,可以直接用,所以性能比字典高
/// 
/// 每个不同的T,都会生成一份不同的副本,适合不同类型,需要缓存一份数据的场景,泛型缓存字典是缓存字典性能的几十倍乃至上百倍
/// 局限性:只能为某个类型存一个结果,例如为int类型存一个结果,又要为string类型存一个结果
/// </summary>
/// <typeparam name="T"></typeparam>
public class GenericCache<T>
{
	static GenericCache()
	{
		Console.WriteLine("This is GenericCache 静态构造函数");
		_TypeTime = string.Format("{0}_{1}", typeof(T).FullName, DateTime.Now.ToString("yyyyMMddHHmmss.fff"));
	}
	private static string _TypeTime = "";

	public static string GetCache()
	{
		return _TypeTime;
	}
}