在我的代码我通过COM接口实例的传统的Delphi对象。 这个类需要被实例化多次,所以为了降低其实例化的开销,我缓存它在一个地步,所有的呼叫有70%的共同生成的对象。

然而,当我改变对象时,它被缓存之后,这些更改将在高速缓存持续太。这使我想到了COM包装实例由裁判,而不是按值传递。结果 我怎样才能确保在缓存中的对象是按值传递而不是由参?

有帮助吗?

解决方案

我认为,如果有可能在所有的事,你需要显式克隆对象的副本,然后缓存副本。参见例如MemberwiseClone方法,并且在答案中提到他人克隆在C#对象。

其他提示

<强>首先,这需要吗

我不是“测量解决所有的性能问题”的倡导者,但在你的情况,你应该。

实例化一个COM对象(在第一次调用处罚后),这样的开销非常低 - 记住它的目的是提供的15年前的计算机上的许多小物件。我假设.NET开销没有太大的 - 这样的问题是物体自己的初始化。

可以通过在紧凑循环中实例化的对象1000检查容易(扔掉第一呼叫,它可以是非常昂贵的并且会破坏平均)

<强> COM对象本质上通过引用结果 没有“按值传递” COM对象,因为它们的基本接口是计数指针实例的引用,和COM不暴露一个通用的“克隆”的方法。

<强>可能的解决方案:写入时复制结果 如果仅当实例化的真正的昂贵,大多数电话都可以通过默认实例完成,你可以实现一个写入时复制方案。

您需要创建一个包装类保存到默认实例的引用,并初始化为0私人实例的引用。

只要私有实例是null,所有getter函数前进到默认实例器;否则,它们向前到私有实例

每一个二传手/突变的呼叫转发到专用实例,创建它,当它不存在。

这会耽误创作私营实例的第一不同诱变电话。但是,你必须包装在整个的这个组件感兴趣的所有接口。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top