Tag: 剖析

在哪里可以找到要在Visual Studio 2008中使用的C#应用​​程序的分析器?

我正在为在Visual Studio 2008中开发的C#应用​​程序寻找一个分析器。我正在寻找价格低廉(开源是首选)的东西,它可以集成到VS2008中。 我找到了Visual Studio Profiler,但我不知道如何使用它。 我安装了Stand Alone版本,它取决于Visual Studio(我猜不是单独使用?)但是在工具菜单中没有任何东西出现,就像他们走过去所说的那样。

了解VS2010 C#并行分析结果

我有一个程序有很多独立的计算,所以我决定并行化它。 我使用Parallel.For / Each。 双核机器的结果还可以 – 大多数时候CPU利用率约为80%-90%。 然而,使用双Xeon机器(即8个内核),我只获得了大约30%-40%的CPU利用率,尽管该程序在并行部分上花费了相当多的时间(有时超过10秒),我看到它使用了与串行部分相比,这些部分中大约有20-30个线程。 每个线程需要1秒以上才能完成,因此我认为没有理由不能并行工作 – 除非存在同步问题。 我使用了VS2010的内置分析器,结果很奇怪。 即使我只在一个地方使用锁,分析器报告大约85%的程序时间花在同步上(5-7%睡眠,5-7%执行,1%IO)。 锁定的代码只是一个缓存(字典)get / add: bool esn_found; lock (lock_load_esn) esn_found = cache.TryGetValue(st, out esn); if(!esn_found) { esn = pData.esa_inv_idx.esa[term_idx]; esn.populate(pData.esa_inv_idx.datafile); lock (lock_load_esn) { if (!cache.ContainsKey(st)) cache.Add(st, esn); } } lock_load_esn是Object类的静态成员。 esn.populate使用单独的StreamReader为每个线程从文件中读取。 但是,当我按下同步按钮以查看导致最大延迟的原因时,我看到探查器报告的是function入口线,并且不会报告锁定的部分本身。 它甚至没有报告包含上述代码的function(提醒 – 程序中唯一的锁定 )作为阻塞配置文件的一部分,噪声级别为2%。 当噪音水平为0%时,它会报告程序的所有function,我不明白为什么它们被视为阻塞同步。 所以我的问题是 – 这里发生了什么? 如何将85%的时间用于同步? 如何找出程序中并行部分的问题? 谢谢。 更新 […]