c# - 花在同步上的线程时间是否太高?

标签 c# multithreading performance concurrency micro-optimization

今天,我使用 Visual Studio 2010 性能分析器分析了我的一个 C# 应用程序。具体来说,我正在分析“并发”,因为看起来我的应用程序应该比它展示的容量更大。分析报告显示,线程花费大约 70-80% 的时间处于同步状态。

老实说,我不确定这是什么意思。这是否意味着应用程序处于活锁状态?

对于上下文...有大约 30 多个长时间运行的线程绑定(bind)到单个 AppDomain(如果这很重要)并且一些线程非常忙(例如。while( true) { _waitEvent.WaitOne(0);//做一些事情 }).

我意识到这是一个相当模糊的问题......我想我正在寻找一些关于线程同步状态含义的解释。多少算太多,为什么? ~75% 真的很糟糕吗?我的线程太多了吗?还是我应该开始寻找其他领域?

最佳答案

I'm not sure what this means.

这意味着线程平均花费 75% 的时间等待另一个线程完成一些工作。

Does this mean that the application is suffering from a live-lock condition?

也许吧!

为不熟悉该术语的读者澄清:“死锁”是指两个线程都在等待对方完成,因此它们永远等待。 “活锁”是两个线程试图避免死锁的情况,但由于他们的选择不当,大部分时间都在等待。想象一下,例如一张 table 上有两个人,一把 fork 和一把刀。两个人都想拿起这两种器具,使用它们,然后放下它们。假设我拿起刀,你拿起 fork 。如果我们都决定等待对方放下餐具,我们就会陷入僵局。如果我们都意识到我们即将陷入僵局,我放下刀,你放下 fork ,然后我拿起 fork ,你拿起刀,我们就活了-锁定。我们可以无限期地重复这个过程;我们都在努力解决问题,但我们的沟通不够有效,无法真正迅速解决问题。

但是,我猜测是您没有处于活锁状态。我的猜测是,您只是对少数一次只能由一个线程访问的关键资源进行大量争用。奥卡姆 Razor 表明您应该假设简单的假设——许多线程轮流使用稀缺资源——而不是复杂的假设——一大堆线程都试图告诉对方“不,你先走”。

There are ~30+ long-running threads bound to a single AppDomain (if that matters) and some of the threads are very busy (Ex. while(true) { _waitEvent.WaitOne(0); //do stuff }).

听起来很糟糕。

I realize this is a fairly vague question.

是的,是的。

How much is too much, and why?

好吧,假设您正试图开车穿过城镇,而您和城市中的所有其他司机花费了 75% 的时间停在红绿灯处等待其他司机。你告诉我:是不是太多了,为什么?在交通中花费一个小时来驾车 15 分钟的距离可能对某些人来说是完全可以接受的,而对其他人来说则是完全不能接受的。每次我在高峰时间乘坐 SR 520 时,我都会在交通中花费一个小时来移动应该需要 15 分钟的距离;这对我来说是不能接受的,所以现在我坐公共(public)汽车了。

您和您的客户是否可以接受这种糟糕的表现,这是您的决定。解决性能问题代价高昂。您应该问的问题是,如果您承担诊断和解决问题的费用,您将获得多少利润。

Is ~75% really bad?

您的线程花费的时间比他们需要的时间长四倍。对我来说似乎不太好。

Do I have too many threads?

你几乎肯定会,是的。 30 很多。

但在您的情况下,这完全是错误的技术问题。问“我的线程太多了吗?”就像试图通过问“这个城市有太多汽车吗?”来解决交通拥堵一样,正确的问题是“为什么这个城市有这么多红绿灯高速公路?”问题不在于线程; 问题是他们互相等待,而不是不停地开车前往目的地。

should I just start looking in other areas?

我们到底应该怎么知道?

关于c# - 花在同步上的线程时间是否太高?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8316984/

相关文章:

c# - .NET Core 3.0 身份问题

c# - Mvc 4.0 中的存储库模式

c++ - MFC中不断增加进度条

c++ - openMP - 并发访问变量和原子

mysql - 两个内连接导致执行缓慢

c# - 根据计算改变时间

c# - Azure 应用程序可以在开发结构上运行,但在部署时无法运行

php - 同时运行同一个脚本与PHP的单线程状态

python - 有效地从列表中删除重复项

银光性能测试