通用工厂:缓存与重复实例化
|
我有一个通用工厂,该工厂在实例返回之前会缓存它(简化代码):
static class Factory<T>
where T : class
{
private static T instance;
public static T GetInstance()
{
if (instance == null) instance = new T();
return instance;
}
}
我想用非缓存方法代替这种方法,以表明缓存对实例化性能没有意义(我相信创建新对象非常便宜)。
因此,我想编写一个负载测试,它将创建一个动态的,仅限运行时的类型(例如1000)的交易并将其加载到我的工厂中。一个会缓存,另一个会缓存。
没有找到相关结果
已邀请:
2 个回复
嘘伪
净爽
概括地说,上面的代码是一个控制台应用程序,具有用于提供服务源抽象的接口的概念。我使用IService通用约束只是为了展示它可能如何起作用的示例。我不想键入或发布1000个单独的类型定义,所以我做了第二件好事,并创建了三个类-A,B和C-并使用每种技术每1000次访问了它们-重复实例化,泛型类型缓存,和基于集合的缓存。 通过少量访问,差异可以忽略不计,但是我的服务构造函数当然是简单的(默认的无参数构造函数),因此它不计算任何内容,访问数据库,访问配置或典型服务类在构造它们时所做的任何事情。如果不是这种情况,那么某种缓存策略的好处显然将对性能有所帮助。同样,即使在具有1,000,000次访问的caes中访问默认构造函数时,未缓存和未缓存之间也存在巨大差异(3s:120ms),因此,教训是,如果您要进行大量访问或需要频繁访问的复杂计算在整个工厂中进行缓存不仅有益,而且取决于是否会影响用户的感知或对时间敏感的业务流程,因此缓存是否必要,否则所带来的好处可忽略不计。要记住的重要一点是,您不仅要担心实例化时间,而且还要担心垃圾收集器上的负载。