2009-08-31 71 views
2

我一直令人头大我的脑袋,试图找出究竟发生了什么事情与最近的(非测试版)的Visual Studio 2008 SP1:Visual Studio 2008 SP1引入了运行时错误还是我疯了?

我使用OpenMP内置的应用程序运行在调试器慢得令人难以置信,使CPU使用率达到100%。当它们在调试器外部运行时,它只是运行缓慢(对于发布版本)。

使用英特尔线程构建模块库或我自己的线程团队实现构建的应用程序在调试器中运行速度比在调试器外部运行时要慢(对于发布版本)。

当我去另一台没有安装SP1的开发机器时,情况就不一样了。在调试器或外部运行对程序性能没有影响。 OpenMP加速我的应用程序,就像线程构建模块或我自己的线程团队代码一样(为了解决这个问题而急匆匆地写出来)。

这是完全不会对应用程序进行任何更改,只需在调试器SP1或常规Visual Studio内部或外部运行即可。

我在谷歌上没有发现任何关于此事的信息,所以我坚持不懈地说出一些话,希望别人可能会认识到这一点正在发生在他们身上。要么,要么是我看到的东西。

+0

您是否尝试过使用性能分析器得到什么方法是最消耗时间的想法?这可能会给你提示底层问题是什么。 – bobbymcr 2009-08-31 00:43:51

+0

我已经使用了分析器。但是剖析器不附加调试器,所以应用程序的行为不同。多线程版本的配置文件输出看起来与常规版本相同。出现了相同的热点 - 我已经尽可能地在优化方面做了很多工作。 – 2009-08-31 18:24:09

回答

2

是的。在某些情况下。切换到SP1后,我们遇到了极其缓慢的类似情况。造成这种情况的原因是例外。我们有一个数据模型是由大量使用试图访问在字典中键的模式的,有它失败,并捕捉异常:

try { 
    var a = dict[key]; 
} catch(KeyNotFoundException) { 
    dict[key] = default; 
    a = default; 
} 

这只是一个例子,但原因是任何异常在所有。无论出于何种原因,仅在调试器中,VS非常缓慢。请注意,这是以前的情况,但是新补丁更糟糕。

解决方案是简单地总是使用测试。对于上面的字典例子,使用.TryGet或者在自定义代码中检查你的调用在调用它之前是否会产生一个异常,如果它会发生很多事情(因此是一个'预期'事物,而不是'特殊'事物) 。

更多信息:Exceptions and Performance

相关问题