在计时器滴答 performance/GC 上创建新实例?
Creating a new instance on timer tick performance/GC?
目前我有一个滴答率大约为 10/s 的计时器。在每次报价时,它都会创建一个新的 MyClass 实例。
所以基本喜欢
var obj = new MyClass(...)
然后使用
从中获取值
lblText.Text = obj.Name();
MyClass 从其他进程的内存中读取值并将它们显示在我的表单中。为什么我每次都需要创建一个新实例是为了更新我的指针的地址(它在我的 public MyClass()
方法中)。
所以我的问题是:
创建 MyClass 的全局实例并只创建一个 Refresh
方法来提高性能是否更好?如果我正确理解 .NET,GC 将以随机(?)间隔触发并收集未使用的实例,但在它进行垃圾收集之前,未使用的实例是否只是坐在内存中什么都不做?我对编程还很陌生,所以我不太了解这里的幕后情况。
is it better for performance to create a global instance of MyClass and just make a Refresh method I call on every tick?
这里的任何人都不可能肯定地回答这个问题。您不太可能会注意到使用具有刷新功能的单个全局实例与使用全新对象的性能差异,因为每秒 10 个对象远低于 .NET 垃圾收集器的理论最大吞吐量。 (一篇文章建议 "tens of millions of small objects per second" 的实际吞吐量。)
但如果不实际测试 代码,就不可能确定。
If I understand .NET correctly the GC will at a random(?) interval trigger and collect the unused instances, but until it does its garbage collection will the unused instances just sit there in memory and do nothing?
是的,GC 会定期清理堆,收集旧的、未使用的对象。是的,在这种情况发生之前,您会将那些未使用的对象放在堆中什么都不做。
什么都不做,它们对你程序的性能没有影响。就垃圾收集器而言,"unused" 的定义是 "cannot be reached",即没有指向该对象的对象引用的连接图。由于无法访问该对象,因此没有代码可以执行该对象的任何代码。
对象只能占用内存。这通常不会造成任何伤害。
一般来说,处理性能问题的经验法则是"don't, not yet"。也就是说,您的主要关注点应该放在编写良好、正确且易于理解的代码上。完成后,您就可以查看该代码的性能是否足够好。几乎所有时候,它都会。
请注意,"performs well enough" 本身就是一个加载短语。这意味着:
一个。您已经测量了您代码的性能
b.您有明确的表现 目标,并且
C。测量性能未能达到明确定义的目标
如果没有良好的衡量标准和目标,就不可能进行任何有意义的性能分析。
只有当您经历了所有这些并发现代码性能不够好的罕见情况后,您才能继续解决该问题。
目前我有一个滴答率大约为 10/s 的计时器。在每次报价时,它都会创建一个新的 MyClass 实例。
所以基本喜欢
var obj = new MyClass(...)
然后使用
从中获取值lblText.Text = obj.Name();
MyClass 从其他进程的内存中读取值并将它们显示在我的表单中。为什么我每次都需要创建一个新实例是为了更新我的指针的地址(它在我的 public MyClass()
方法中)。
所以我的问题是:
创建 MyClass 的全局实例并只创建一个 Refresh
方法来提高性能是否更好?如果我正确理解 .NET,GC 将以随机(?)间隔触发并收集未使用的实例,但在它进行垃圾收集之前,未使用的实例是否只是坐在内存中什么都不做?我对编程还很陌生,所以我不太了解这里的幕后情况。
is it better for performance to create a global instance of MyClass and just make a Refresh method I call on every tick?
这里的任何人都不可能肯定地回答这个问题。您不太可能会注意到使用具有刷新功能的单个全局实例与使用全新对象的性能差异,因为每秒 10 个对象远低于 .NET 垃圾收集器的理论最大吞吐量。 (一篇文章建议 "tens of millions of small objects per second" 的实际吞吐量。)
但如果不实际测试 代码,就不可能确定。
If I understand .NET correctly the GC will at a random(?) interval trigger and collect the unused instances, but until it does its garbage collection will the unused instances just sit there in memory and do nothing?
是的,GC 会定期清理堆,收集旧的、未使用的对象。是的,在这种情况发生之前,您会将那些未使用的对象放在堆中什么都不做。
什么都不做,它们对你程序的性能没有影响。就垃圾收集器而言,"unused" 的定义是 "cannot be reached",即没有指向该对象的对象引用的连接图。由于无法访问该对象,因此没有代码可以执行该对象的任何代码。
对象只能占用内存。这通常不会造成任何伤害。
一般来说,处理性能问题的经验法则是"don't, not yet"。也就是说,您的主要关注点应该放在编写良好、正确且易于理解的代码上。完成后,您就可以查看该代码的性能是否足够好。几乎所有时候,它都会。
请注意,"performs well enough" 本身就是一个加载短语。这意味着:
一个。您已经测量了您代码的性能
b.您有明确的表现 目标,并且
C。测量性能未能达到明确定义的目标
如果没有良好的衡量标准和目标,就不可能进行任何有意义的性能分析。
只有当您经历了所有这些并发现代码性能不够好的罕见情况后,您才能继续解决该问题。