C# 是否在timer tick performance/GC上创建新实例?

C# 是否在timer tick performance/GC上创建新实例?,c#,garbage-collection,C#,Garbage Collection,目前我有一个计时器,滴答声大约为10/s。在每个刻度上,它都会创建MyClass的新实例 所以基本上就像 var obj = new MyClass(...) 然后用 lblText.Text = obj.Name(); MyClass从其他进程的内存中读取值,并以我的形式显示它们。为什么每次我都需要创建一个新实例是为了从指针更新地址(在我的public MyClass()方法中) 所以我的问题是: 创建MyClass的全局实例并在每次勾选时调用Refresh方法是否会提高性能?如果我正确理

目前我有一个计时器,滴答声大约为10/s。在每个刻度上,它都会创建MyClass的新实例

所以基本上就像

var obj = new MyClass(...)
然后用

lblText.Text = obj.Name();
MyClass从其他进程的内存中读取值,并以我的形式显示它们。为什么每次我都需要创建一个新实例是为了从指针更新地址(在我的
public MyClass()
方法中)

所以我的问题是:

创建MyClass的全局实例并在每次勾选时调用
Refresh
方法是否会提高性能?如果我正确理解.NET,GC将以随机(?)间隔触发并收集未使用的实例,但在它进行垃圾收集之前,未使用的实例是否会在内存中静止不动?我对编程相当陌生,所以我不太了解这里到底发生了什么

创建MyClass的全局实例并在每次勾选时调用一个刷新方法是否会提高性能

在座的任何人都不可能肯定地回答这个问题。您不太可能注意到使用具有刷新的单个全局实例与使用全新对象时的性能差异,因为每秒10个对象远远低于.NET垃圾收集器理论上的最大吞吐量。(一篇文章提出了一个实际的吞吐量。)

但是如果不实际测试代码,就不可能确定

如果我正确理解.NET,GC将以随机(?)间隔触发并收集未使用的实例,但在它进行垃圾收集之前,未使用的实例是否会在内存中静止不动

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

什么都不做,它们对程序的性能没有影响。就垃圾收集器而言,“未使用”的定义是“无法到达”,即没有指向该对象的对象引用的连接图。由于无法访问该对象,因此任何代码都不能执行该对象的任何代码

对象所能做的就是占用内存。一般来说,这不会造成任何伤害


一般来说,处理性能问题的经验法则是“不要,还没有”。也就是说,您的主要关注点应该是编写良好、正确、可理解的代码。一旦您完成了这项工作,您就可以查看该代码的性能是否足够好。几乎所有的时候,它都会

请注意,“性能足够好”本身就是一个加载的短语。这意味着:

a。您已经测量了代码的性能
B您有一个明确的绩效目标,并且
C衡量绩效未能达到明确的目标

如果没有良好的衡量标准和目标,就不可能进行任何有意义的绩效分析


只有当您经历了所有这些并发现代码执行不够好的罕见情况后,您才能继续解决这个问题。

您可以每秒创建数百万个对象。以你所使用的速率,这并不重要,你永远不会注意到差异。试试看,量量自己。查看Eric Lippert的文章,看看如何/是否可以改进您的帖子。在这种情况下,全局实例似乎是正确的方法。正如Hans在前面的评论中所说,从人的角度来看,你永远不会注意到差异,但是每次你创建一个新实例时,你都会在GC中放入一个重载,因此实例越少效率越高。@KellermanRivero-不,全局实例越容易出错,甚至效率越低。短寿命内存非常便宜。要实现性能,通常需要仔细编程。全局实例或静态类通常需要使用某种类型的同步机制。容易出错并不意味着效率较低。