gpt4 book ai didi

.net - 测量 TPL 中的并行度

转载 作者:行者123 更新时间:2023-12-01 02:30:41 24 4
gpt4 key购买 nike

任务并行库和 TPL 数据流允许指定最大并行度。该值是上限,而不是保证。事实上,TPL 将根据包括系统资源在内的许多因素来确定实际的并行度,但不会超过任何程序员指定的最大值。

是否有某种机制可以确定 TPL 在某个时间点对并行度所做的选择?

我特意询问是因为我移植了一些相当复杂的代码来使用 TPL Dataflow,并且总体吞吐量远低于原始代码。我想看看 TPL 代表我做了哪些选择,以了解为什么它要慢得多。

最佳答案

我遇到了和你非常相似的情况。我最终使用我的日志数据来大致告诉我每分钟使用了多少线程。这给了我一个粗略的数字,但并不准确。

我不相信 TPL 可以为您提供有关线程使用情况的遥测。如果你想实现更精确的东西,我建议在每个任务/线程中实现逻辑来标记它开始和完成时间的一些共享列表。这是我如何开始的一个例子。

public class DoSomeTPLWork
{
public static void Start()
{
List<int> numberList = Enumerable.Range(1, 1000).ToList();

Parallel.ForEach(numberList, number =>
{
ThreadTracking.ThreadStarted();

int square = number * number;
Console.WriteLine("Square of {0} is {1}", number, square);

ThreadTracking.ThreadFinished();
}
);

var threadInfo = ThreadTracking.GetThreadInfo();
}
}

public class ThreadTracking
{
private static ConcurrentBag<ThreadInfo> _threadInfo = new ConcurrentBag<ThreadInfo>();

public static void ThreadStarted()
{
var threadInfo = new ThreadInfo(Thread.CurrentThread.ManagedThreadId);
threadInfo.Start();
_threadInfo.Add(threadInfo);
}

public static void ThreadFinished()
{
var threadInfo = _threadInfo.Where(ti => ti.ThreadId == Thread.CurrentThread.ManagedThreadId && !ti.Complete).SingleOrDefault();
if(threadInfo != null)
{
threadInfo.Stop();
}
}

public static List<ThreadInfo> GetThreadInfo()
{
return _threadInfo.ToList();
}
}

public class ThreadInfo
{
public bool Complete { get; set; }
public int ThreadId { get; set; }
public DateTime? TimeStarted { get; set; }
public DateTime? TimeFinished { get; set; }

public ThreadInfo(int threadId)
{
ThreadId = threadId;
}

public void Start()
{
TimeStarted = DateTime.Now;
Complete = false;
}

public void Stop()
{
TimeFinished = DateTime.Now;
Complete = true;
}
}

使用数据,您可以通过添加更多方法来查询数据或只是将其弹出到 Excel 中来查看在任何给定秒内使用了多少线程。

关于.net - 测量 TPL 中的并行度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13168429/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com