2011-06-15 39 views
0

我创建了一个程序来计算一个变量包括表达式,如“x”,“x + 1”,“sin(x)”的积分当我在vs中调试时,我得到了很慢计算过程是F#编译器的诡计吗?

但是当我打开输出执行(在仓/调试/)我得到了相当的速度处理,结果几乎立即出现,当然等于结果的,我得到通过上述试验

请告诉我这是什么招,为什么发生?

,如果可以,请指导我的算法计算出任意VAR表达

感谢很多的整合,我爱堆栈交换了这么多^^

回答

3

这是很正常的一个程序运行速度变慢调试模式比正常的自由执行。没有技巧。

2

如果您在没有从Visual Studio中调试的情况下运行,您也将获得良好的性能。调试减慢程序速度的原因有两方面。

首先有几个优化,JITer可以做但不会在调试器连接时执行,这些优化使得代码无法跨步,但输出等效信息。

例如下面的代码可能被JIT完全删除(除了定义)。

int[] data = new int[10000]; 
for (int i = 0; i < data.Length; i++) 
    data[i] = 0; 

原因是数组的构造函数清除了内容,因此这个操作是多余的。但是,在调试时,您可能需要逐步完成代码,以便保留它。

此外,在高性能部分,由于每个其他操作都是NOP,所以通常会有50%的降速,它不做任何事情,但仍需要一个时钟周期。这些NOP是启用断点的功能,但如果没有附加调试器,则不会由JIT发出。

请注意,我所说的是泛化,编译器和JIT的实际交互有点复杂。