是F#编译器的把戏吗?

| 我创建了一个程序来计算变量包括表达式(例如\“ x \”,\“ x + 1 \”,\“ sin(x)\”)的积分 当我在vs中调试时,我的计算过程非常缓慢 但是当我打开输出execute(在bin / debug /中)时,我得到了相当不错的速度,结果几乎立即出现了,当然等于我通过上述测试得到的结果 请告诉我那是什么把戏,为什么会发生呢? 如果可以的话,请指导我计算任意var-expression积分的算法 非常感谢,我非常喜欢堆栈交换^^     
已邀请:
        在调试模式下运行程序的速度要比正常的自由执行慢。没有窍门。     
        如果您运行时没有从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的实际交互要复杂一些。     
        对于第二个问题,即多元数值积分,您可以看一下蒙特卡洛积分。 如果要积分的函数是概率分布,则可能需要阅读Gibbs采样方法。     

要回复问题请先登录注册