在计时器计时性能/GC上创建一个新实例

本文关键字:新实例 实例 一个 创建 计时器 性能 GC | 更新日期: 2023-09-27 18:18:59

目前我有一个计时器滴答率约为10/s。

基本上就是

var obj = new MyClass(...)

,然后用

获取值
lblText.Text = obj.Name();

MyClass从其他进程的内存中读取值并在我的表单中显示它们。为什么我需要每次在tick上创建一个新实例是为了从我的指针更新地址(它在我的public MyClass()方法中)。

我的问题是:

它是更好的性能创建MyClass的全局实例,只是做一个Refresh方法我调用每tick?如果我正确理解。net, GC将在一个随机的(?)间隔触发和收集未使用的实例,但直到它做它的垃圾收集将未使用的实例只是坐在那里的内存和什么都不做?我对编程很陌生,所以我不太明白这里到底发生了什么。

在计时器计时性能/GC上创建一个新实例

它是更好的性能,以创建MyClass的全局实例,只是做一个刷新方法,我在每一个滴答?

这里的任何人都不能肯定地回答那个问题。使用带有刷新功能的单个全局实例与使用全新对象不太可能注意到性能差异,因为每秒10个对象远远低于。net垃圾收集器理论上的最大吞吐量。(一篇文章建议"每秒处理数千万个小对象"的实际吞吐量。)

但是如果没有真正的测试代码,就不可能确定。

如果我正确理解。net的GC将在一个随机的(?)间隔触发和收集未使用的实例,但直到它做它的垃圾收集将未使用的实例只是坐在那里在内存和什么都不做?

是的,GC定期清理堆,收集旧的、未使用的对象。是的,在此之前,堆中那些未使用的对象什么也不做。

不做任何事情,它们对程序的性能没有影响。对于垃圾收集器而言,"未使用"的定义是"无法到达",即没有指向该对象的对象引用的连通图。由于无法到达该对象,因此没有代码可以执行该对象的任何代码。

对象所能做的就是占用内存。这通常不会造成任何伤害。


一般来说,处理性能问题的经验法则是"不要,还没有"。也就是说,您的主要关注点应该放在编写良好、正确、可理解的代码上。一旦您完成了这些,那么您就可以查看代码是否执行得足够好。几乎所有的时间,它会。

注意,"表现足够好"本身就是一个有内涵的短语。这意味着:

。您已经测量了代码的性能
B.你有一个明确的性能目标,并且
C.度量性能不能满足定义良好的目标

如果没有良好的度量和目标,就不可能进行任何有意义的性能分析。

只有当您完成了所有这些并发现了代码性能不够好的罕见情况时,您才能继续解决该问题。