【问题标题】:Static member of singleton vs static local members vs local members单例的静态成员 vs 静态本地成员 vs 本地成员
【发布时间】:2014-02-11 08:06:27
【问题描述】:

我有一个包含设置的单例静态类Settings.Instance.MemberName。
此类位于包含多个项目的解决方案内的 GlobalSettings 项目中。

所有项目都编译为 DLL 并由外部 Windows 服务进程使用。
在此解决方案的一个项目中,我有 100-200 个 ClassA 实例,此类用于使用网络套接字从设备轮询数据。
轮询是用一定的逻辑完成的,我使用来自Settings.Instance的设置, 例如,设置是轮询之间的睡眠时间。

socket.Send(..);
Thread.Sleep(Settings.Instance.SleepBetweenSendAndReceive);
socket.Receive(..);

我的问题是,做什么更好?

  1. 所有实例都应该像上面一样直接调用 Settings.Instance.MaxNetworkRetries。

  2. 在 ClassA 构造函数中,我应该将所有设置加载到本地 静态 私有成员

    (Thread.Sleep(_sleepBetweenSendAndReceive);)

  3. 在 ClassA 构造函数中,我应该将所有设置加载到本地私有成员

    (Thread.Sleep(_sleepBetweenSendAndReceive);)

什么可以提供最佳性能?或者也许根本没有区别。

【问题讨论】:

  • 您是否遇到过与该代码相关的任何性能问题?也许更重要的问题是:Settings.Instance.MemberName 值在程序执行期间是否有可能发生变化?
  • 他们不会改变。我在使用套接字的过程中遇到了性能问题,我正在尽我所能以使这段代码更好地工作,我知道这是一个小的改进,如果有的话.. 我只是好奇什么更好,还有教育目的.

标签: c# .net static


【解决方案1】:

无论如何,如果您只想Sleep(),我无法想象那里会有任何性能问题。

当涉及到网络通信时,网络通常是瓶颈,属性调用的开销可以忽略不计。

如果您想提高应用程序的性能,您可以删除 Sleep(),然后阻止 Receive() 或异步接收数据(如果您不确定要接收数据)。

但最后,访问同一个类中的字段应该比静态类的属性更快。您可以编写一个没有网络通信的示例项目,并且时间差。

【讨论】:

  • 我已经解决了网络问题,至少是其中的一部分。这个问题是关于调用我的类的静态成员、我的类的私有成员或来自另一个加载到同一个 dll 的静态成员过程..
  • @ilansch 从另一个类访问成员与从同一个类相比有一些开销,但如果来自不同的 dll 则无关紧要。我真正知道的是,您通常不会注意到任何性能差异。如果你想要数字,很容易进行基准测试。
猜你喜欢
  • 1970-01-01
  • 2015-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多