我正在调查特定操作完成所需的时间.操作如下:
Parallel.ForEach(items, item => SaveScheme(item));
Run Code Online (Sandbox Code Playgroud)
该SaveScheme方法适用于数据库:执行一些查询并处理信息.items收集中的元素数量可以足够大.
当我运行此操作时,大约需要20-40秒才能完成.但是当我打开一个配置文件运行它时,它只需要3秒!
我没有找到有关此问题的任何信息.我唯一的猜测是,分析Parallel.ForEach创建的线程多于没有它的线程,但我不确定,即使它是真的,我也不知道如何处理它.
那么,为什么会发生这种情况呢?当我在没有分析的情况下运行应用程序时,我怎样才能达到这种性能?
UPD.Parallel与此无关:我用简单测试,foreach操作仍然在3秒内完成!
我有一个运行速度非常慢的程序(即使在发布时也需要20秒)所以,想要修复它,我尝试使用Visual Studio内置的分析器.但是,当我运行启用了性能分析的程序时,它会在不到一秒的时间内完成.这使得很难找到瓶颈.我会发布代码,但它很长.有没有明显的或不那么明显的原因导致这种情况发生?
编辑:好的,所以我把问题缩小到一堆free()调用.当我将它们注释掉时,程序运行的时间与启用性能分析的时间相同.但现在我有内存泄漏: - /
编辑1
我根本不排除这可能是由使用Profiler的一些非常基本的副作用引起的(我的"常规"项目中的一些错误设置)
我想在我的应用程序中改进计算时间,所以我决定进行彻底的分析分析.所以我刚刚启动了.Net内存分配配置文件来分析我的应用程序.
我完全惊呆了,看着计算速度提高了20倍!
应用程序包括从带有BackgroundWorkers的二进制文件读取数据,处理它们,
并将结果存储到MSSQL DB中.每轮通常需要20秒,而分析它几乎需要1秒.我检查并确保两种情况下结果一致.
一个.Net实验的朋友告诉我,探查器优化了线程并"以某种方式"找到了通过线程锁和瓶颈的方式,但我简直不敢相信.
所以我的问题是:
编辑2
我知道这听起来很疯狂,令人难以置信.我自己仍然非常怀疑.但它是真的.
在分析器运行时,SAME代码运行得非常快.我使用SAME测试数据,并观察SAME计算输出.我无法给出一个简单的复制项目,因为它是一个相对较大的框架.我正在使用Visual Studio 2010 Profiler.
我将尽可能多地提供关于流程的详细信息,并且一旦发现它就会发布一条线索.
定期运行日志:
03/23/2011 18:04:34 | 180434.621 | 模拟集[5] - [1] - [5 PC-1 0 [SET 1/48]
03/23/2011 18:05:01 | 180501.271 | 处理时间:00:00:26.6515244
等
Profiler运行LOGS:
03/24/2011 11:38:15 | 113815.592 | 模拟集[5] - [1] - [5 PC-1 0 [SET 1/48]
03/24/2011 11:38:17 | 113817.350 | 处理时间:00:00:01.7581005
等
编辑3:线索
确定好的我的坏(我在编辑1上警告这种可能性,因为这太令人难以置信了.抱歉)@Watts建议检查我是否处于调试或发布模式.我已经做过了.但@SnowBear指出有两个不同的东西:运行调试版软件和在调试器下运行软件我确保在Build and Execution中的活动配置是RELEASE是VS2010.但是,由于我刚刚疯狂,我决定直接从bin/release中的exe文件启动应用程序.而且......过程每个过程需要1秒钟.运行Profiler会使您退出调试模式(无论您处于发布模式还是调试模式),这让我感到困惑.
感谢All Case Closed.
我一直在对我编写的物理应用程序进行一些分析,我注意到当我分析它时,它比没有分析器运行得更快,也许更流畅。请注意,我没有在调试配置中运行程序或附加调试器。
我测量了差异,发现程序在分析器下运行速度快了约 50%。我不认为这是重复的,因为另一个问题并没有明确他/她是否在附加调试器的情况下运行它,并且最上面的答案假设情况就是如此(并且 20 倍加速强烈表明它将是正确的大多数情况下都会回答)。
另一个答案表明存在“海森堡”错误,但这是一种包罗万象的假设(我仍将沿着这条线进行调查)。
Visual Studio 是否可能执行某些操作来防止其他应用程序干扰我的应用程序的计算或内存资源(以便获得“更公平”的结果)?