|
1
505
C编译器本身不会在发布版本中对发出的IL进行很大的更改。值得注意的是,它不再发出允许在大括号上设置断点的NOP操作码。最大的一个是内置在JIT编译器中的优化器。我知道它进行了以下优化:
这些是非常重要的优化,可以使 例如,当您分析应用程序的调试版本并将其与发布版本进行比较时,需要处理差异。不过,只有当代码在关键路径上时,你编写的代码的5%到10%才是真正重要的 事实上 这些优化对程序执行时间的有效结果通常会受到在其他地方运行的代码的影响。读取文件、执行dbase查询等,使JIT优化器所做的工作完全不可见。不过也不介意:) JIT优化器是相当可靠的代码,主要是因为它已经被测试了数百万次。在程序的发布版本中很少有问题。但它确实发生了。x64和x86抖动都有结构问题。x86抖动在浮点一致性方面有问题,当浮点计算的中间部分以80位精度保存在FPU寄存器中而不是在刷新到内存时被截断时,会产生细微的不同结果。 |
|
|
2
23
依赖于
|
|
|
3
12
这在很大程度上取决于应用程序的性质。如果你的应用程序很重UI,你可能不会注意到任何区别,因为连接到现代计算机的最慢组件是用户。如果使用一些UI动画,则可能需要测试在调试生成中运行时是否能察觉到任何明显的延迟。
这基本上是一个设计上的折衷。如果您是在DEBUG build下发布的,那么如果用户遇到问题,您可以获得更有意义的回溯,并且可以执行更灵活的诊断。通过在调试版本中发布,还可以避免优化器产生模糊 Heisenbugs . |
|
|
4
11
|
|
|
5
9
它可能包含丑陋的代码来支持编辑和继续,或者谁知道还有什么。据我所知,这种情况只在VB中发生,而不是在C中#
(注:原帖子标记为C#)
,但它仍然应该给出暂停的理由,说明微软认为他们可以对调试版本做些什么。事实上,在.NET 4.0之前,VB代码泄漏的内存与您为支持Edit和Continue而构造的事件的对象实例数成比例。(尽管据报道这是根据
https://connect.microsoft.com/VisualStudio/feedback/details/481671/vb-classes-with-events-are-not-garbage-collected-when-debugging
,生成的代码看起来很糟糕,创建
|
|
|
6
5
以我的经验来看,发布模式中最糟糕的事情就是那些晦涩难懂的“发布错误”。由于IL(中间语言)是在发布模式下优化的,因此存在在调试模式下不会出现的错误的可能性。还有其他关于这个问题的问题: Common reasons for bugs in release version not present in debug mode 这种情况在我身上发生过一两次,一个简单的控制台应用程序在调试模式下运行得非常好,但是给定完全相同的输入,在发布模式下就会出错。这些bug非常难以调试(具有讽刺意味的是,根据发布模式的定义)。 |
|
7
3
我想说,1)很大程度上取决于你的执行情况。通常,差别并不大。我做了很多测量,但常常看不出有什么不同。如果使用非托管代码、大量的数组和类似的东西,性能差异会稍微大一些,但不是一个不同的世界(如C++)。2) 通常在发布代码中,显示的错误较少(公差较高),因此开关应该工作正常。 |
|
|
8
0
|
|
|
A B · C#Excel自动调整列避免长文本时出错 1 年前 |
|
|
Megrez7 · C#ToArray转换合并为一行,导致数组元素更改 1 年前 |
|
Aycon · 在工厂方法中释放部分创建的对象的正确方法是什么? 1 年前 |
|
|
Sei · Avalonia/WPF将路由器传递到控制模板 1 年前 |