- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在查看 Roslyn September 2012 CTP使用 Reflector,我注意到 SlidingTextWindow 类具有以下内容:
internal sealed class SlidingTextWindow : IDisposable
{
private static readonly ConcurrentQueue<char[]> arrayPool = new ConcurrentQueue<char[]>();
private int basis;
private readonly LexerBaseCache cache;
private char[] characterWindow;
private int characterWindowCount;
private int characterWindowStart;
private int offset;
private readonly IText text;
private readonly int textEnd;
public SlidingTextWindow(IText text, LexerBaseCache cache)
{
this.text = text;
this.basis = 0;
this.characterWindowStart = 0;
this.offset = 0;
this.textEnd = text.Length;
this.cache = cache;
if (!arrayPool.TryDequeue(out this.characterWindow))
{
this.characterWindow = new char[2048];
}
}
public void Dispose()
{
arrayPool.Enqueue(this.characterWindow);
this.characterWindow = null;
}
// ...
}
我相信此类的目的是通过使用 char[] characterWindow
提供对输入文本子字符串的快速访问,一次从 2048 个字符开始(尽管 characterWindow
可能会增长)。我相信这是因为获取字符数组的子字符串比获取字符串的子字符串更快,如 Eric Lippert seems to indicate on his blog .
SlidingTextWindow
类在每次 Lexer
类实例化时实例化,每次调用 SyntaxTree.ParseText
时都会实例化。
我不明白 arrayPool
字段的用途。它在此类中的唯一用法是在构造函数和 Dispose 方法中。调用 SyntaxTree.ParseText
时,似乎只创建了 Lexer
类和 SlidingTextWindow
类的一个实例。在处置实例时将 characterWindow
入队以及在创建实例时尝试将 characterWindow
出队有什么好处?
也许 Roslyn 团队的某个人可以帮助我理解这一点?
最佳答案
优点是减少了收集压力,这对整体性能有积极影响。
.NET 垃圾收集器当然是通用垃圾收集器。编译器和 IDE 的分配和对象生命周期模式与一般的业务线应用程序有很大不同,它们往往以不同寻常的方式对 GC 施加压力。
如果您纵观整个 Roslyn,就会发现很多地方都缓存了小数组并在以后重新使用,而不是让 GC 将它们识别为短暂的垃圾并立即回收它们。实证实验表明,这可以显着提高性能。
我不建议在您自己的应用程序中这样做,除非您的分析表明您在收集压力方面存在可衡量的性能问题。对于绝大多数应用程序,GC 都经过了很好的调整,池化策略的好处不值得付出可观的成本。
关于c# - 为什么在这种情况下使用 ConcurrentQueue?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18429946/
我有一个类可以从 Web 服务获取对象。我对这些对象的使用与顺序无关,因此我并行发出 Web 请求并将结果添加到 ConcurrentQueue 中。 同时,在发出请求时,我们可以处理响应。 因此,我
我在 C# (4.0) 中有一个常规 Queue 对象,我正在使用访问此 Queue 的 BackgroundWorkers。 我使用的代码如下: do { while
我在 C# (4.0) 中有一个常规 Queue 对象,我正在使用访问此 Queue 的 BackgroundWorkers。 我使用的代码如下: do { while
我希望两个线程与一个队列一起工作。第一个线程应该每 2 秒调用一次,第二个线程 - 每 3 秒调用一次。两个线程应同时启动。访问队列的第一个元素时出现问题。两个线程都获取索引为 0 的元素。有时它会发
我有生产者/消费者的问题。目前我有一个简单的 Queue 被 lock 包围。 我正在尝试用更高效的东西替换它。 我的第一选择是使用 ConcurrentQueue,但我不知道如何让我的消费者等待下一
我正在查看 Roslyn September 2012 CTP使用 Reflector,我注意到 SlidingTextWindow 类具有以下内容: internal sealed class Sl
我在使用 ConcurrentQueue 时发生内存泄漏: requestObject request = xxx; Item obj= new Item (); obj.MessageReceive
我必须维护信息日志,这些日志可以同时从多个线程写入,但是当我需要它们时,我只使用一个线程将其出列,在出列集合之间需要大约 5 秒的时间。 以下是我编写的用于将其出队的代码。 if (timeNotRe
这是一种安全的迭代方式吗 ConcurrentQueue ? while (cq.GetEnumerator().MoveNext()) { IIndexTask task; if (
为什么不ConcurrentQueue有一个 capacity喜欢它的非并发表亲? 也没有提到默认容量。 与非并发版本相比,“缺失”容量是否会影响性能,在非并发版本中,实现者可以提供对队列典型大小的合
我有多个线程生成项目并将它们粘贴在一个共同的 ConcurrentQueue 中: private ConcurrentQueue queuedItems = new ConcurrentQueue(
我有一个 NetworkStream 用于从另一个程序获取数据。数据以 Byte[64] 的形式到达,然后我将其排队到 ConcurrentQueue,以便另一个线程可以出队以供稍后分析。队列被实例化
我想问一下c#中的queue如果 ConcurrentQueue 是安全线程,为什么这段代码的结果是 ~98 k?我有什么问题吗? class Program { static int sum
我有一个应用程序,它有一个 ConcurrentQueue 项目,每个项目都有一个 ID 属性和一个 ConcurrentQueue 任务,队列项目看起来像: class QueueItem {
我正在串行端口上快速接收数据,而在其他线程中我正在处理串行端口上接收到的数据包。因此,对于线程安全的读写操作,我使用并发队列。以下是我在串行端口上接收数据的代码,我存储在并发队列中。 System.C
这很奇怪,我有一个 Thread[]每个工作线程处理 ConcurrentQueue 中的项目直到队列为空,此时程序的其余部分继续。 这一直有效到大约 1500 个项目,此时所有线程都在 WaitSl
我们有一个 ConcurrentQueue 用于在 3 个线程之间共享数据。线程 A 不断地用数据填充队列。线程 B 旨在将此数据记录到文件中。线程 C 应该检索队列中最年轻的条目(或尽可能接近最年轻
在查看 IsEmpty 时,我在 MSDN 上注意到了这一点: However, as this collection is intended to be accessed concurrently,
如何仅在满足某些条件时才将 ConcurrentQueue 的下一个元素出队? 例如如果要出队的下一个项目满足特定条件,则将其出队,否则离开。本质上是一个 'DequeueIf' 或 'TryDequ
如果队列中没有项目,ConcurrentQueue 中的 TryDequeue 将返回 false。 如果队列为空,我需要我的队列等待新项目添加到队列中并将新项目从队列中取出,然后该过程将继续进行。
我是一名优秀的程序员,十分优秀!