不将引用类型复制到 C# 中的每个线程是不是存在性能劣势? [关闭]

Posted

技术标签:

【中文标题】不将引用类型复制到 C# 中的每个线程是不是存在性能劣势? [关闭]【英文标题】:Is there a performance disadvantage to not copying reference types to each thread in C#? [closed]不将引用类型复制到 C# 中的每个线程是否存在性能劣势? [关闭] 【发布时间】:2021-03-24 04:34:37 【问题描述】:

我正在为我的 C# 程序实现线程。每个线程都需要访问同一个数组,但不需要写入,只需要读取数据。是否应该为每个线程深度复制这个数组?

我认为这可能很重要的原因(根据我对线程的非常有限的了解)是因为不同 CPU 内核上的线程可以将数组的副本存储在它们自己的缓存中,而不是不断地从单个内核的缓存中请求数据,其中数组已存储,但也许编译器或其他东西会优化这种低效率?

任何见解将不胜感激。

【问题讨论】:

您能否在问题中包含一些代码,显示每个线程如何访问数组?例如,它是否通过ParameterizedThreadStart 委托作为参数传递? 别帮忙,处理器已经知道如何自己做到这一点。 根据您的描述,我认为除了降低内存速度和性能之外,没有理由将数组复制到多个副本中,具体取决于副本的大小和数量以及制作这些副本的频率。特别是如果您只是在阅读。 阅读MESI,假设只有一个核心“拥有”只读数据是不正确的。 这个问题的答案应该是,自己做基准测试。 【参考方案1】:

由于您没有指定您正在运行的硬件架构,我将假设它是 Intel 或 AMD x64 处理器。在这种情况下,我建议信任处理器来正确优化这种情况。通过创建编译器不知道的处理器的多个副本是重复副本,您将强制处理器使用更多内存并将可用缓存空间分散到更多内存上,从而降低其有效性。

【讨论】:

以上是关于不将引用类型复制到 C# 中的每个线程是不是存在性能劣势? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何在项目中包含/引用文件而不将其复制到项目目录?

相等性比较 (== ,Equals,ReferenceEquals)

C# 中的线程、值类型和引用类型说明?

如何在 C# 中复制类对象 [重复]

C# 9.0 中的新增功能

命名空间“系统”中不存在类型或命名空间名称“事务”(您是不是缺少程序集引用?) - C# ASP.NET