我创建了一个程序来计算一个变量包括表达式,如“x”,“x + 1”,“sin(x)”的积分当我在vs中调试时,我得到了很慢计算过程是F#编译器的诡计吗?
但是当我打开输出执行(在仓/调试/)我得到了相当的速度处理,结果几乎立即出现,当然等于结果的,我得到通过上述试验
请告诉我这是什么招,为什么发生?
,如果可以,请指导我的算法计算出任意VAR表达
感谢很多的整合,我爱堆栈交换了这么多^^
我创建了一个程序来计算一个变量包括表达式,如“x”,“x + 1”,“sin(x)”的积分当我在vs中调试时,我得到了很慢计算过程是F#编译器的诡计吗?
但是当我打开输出执行(在仓/调试/)我得到了相当的速度处理,结果几乎立即出现,当然等于结果的,我得到通过上述试验
请告诉我这是什么招,为什么发生?
,如果可以,请指导我的算法计算出任意VAR表达
感谢很多的整合,我爱堆栈交换了这么多^^
这是很正常的一个程序运行速度变慢调试模式比正常的自由执行。没有技巧。
对于第二个问题,多元数值积分,你可以看看Monte Carlo integration。
如果要整合的函数是概率分布,那么您可能需要阅读Gibbs sampling方法。
如果您在没有从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的实际交互有点复杂。