我有一个类库,我只使用它的一部分.是否需要删除未使用的内容以缩小创建的代码的大小(在发布配置中)?
据我所见,编译器会处理这个问题,删除代码不会改变EXE文件的大小.这总是如此吗?删除所有不需要的代码需要很长时间,所以我想知道是否需要它.
更多信息:类库中的方法和类不是从执行代码调用的,而是由类库中的其他代码部分引用(它们本身从不被调用).
在对这个答案的评论中(建议使用位移运算符而不是整数乘法/除法,为了提高性能),我询问这实际上是否会更快.在我的脑海中有一个想法,在某种程度上,某些东西将足够巧妙地解决这个问题>> 1并且/ 2是相同的操作.但是,我现在想知道这是否真的是真的,如果是,它会发生在什么级别.
测试程序optimize为两种方法产生以下比较CIL(带有on),分别对其参数进行划分和移位:
IL_0000: ldarg.0
IL_0001: ldc.i4.2
IL_0002: div
IL_0003: ret
} // end of method Program::Divider
Run Code Online (Sandbox Code Playgroud)
与
IL_0000: ldarg.0
IL_0001: ldc.i4.1
IL_0002: shr
IL_0003: ret
} // end of method Program::Shifter
Run Code Online (Sandbox Code Playgroud)
所以C#编译器正在发出div或shr指示,而不是聪明.我现在想看看JITter生成的实际x86汇编程序,但我不知道如何执行此操作.它甚至可能吗?
编辑添加
感谢您的回答,已接受来自nobugz的那个,因为它包含有关该调试器选项的关键信息.最终对我有用的是:
Tools | Options | Debugger,关闭'抑制模块负载上的JIT优化'(即我们希望允许 JIT优化)Debugger.Break()某处发表声明至少可以说结果很有启发性 - 事实证明JITter实际上可以做算术!这是来自"反汇编"窗口的已编辑样本.各种-Shifter方法除以2的幂>>; 各种-Divider …
后随以不.NET JIT优化空循环走?:
以下程序只运行十亿次空循环并打印出运行时间.我的机器需要700毫秒,我很好奇是否有办法让抖动优化掉空循环.
using System;
namespace ConsoleApplication1 {
class Program {
static void Main() {
var start = DateTime.Now;
for (var i = 0; i < 1000000000; i++) {}
Console.WriteLine((DateTime.Now - start).TotalMilliseconds);
}
}
}
Run Code Online (Sandbox Code Playgroud)
据我所知,答案是否定的,但我不知道是否有隐藏的编译器选项,我可能没试过.我确保在发布模式下编译并在没有附加调试器的情况下运行,但仍然需要700毫秒才能运行此空循环.我也试过NGEN同样的结果(虽然我的理解是它应该生成与JIT相同的编译代码,对吧?).但是我之前从未使用过NGEN,可能使用错了.
它看起来像这将是一些容易的JIT发现和优化掉,但是了解甚少抖动一般是如何工作的,我很好奇,如果有这种优化将遭到冷落具体原因.VC++编译器肯定似乎做了这个优化,所以我想知道为什么会出现这种差异.有任何想法吗?
最近,我正在编译Windows下的ffmpeg代码使用带有intel编译器的VS2010.对于以下代码:
void ff_dcadsp_init(DCADSPContext *s)
{
s->lfe_fir = dca_lfe_fir_c;
if (ARCH_ARM) ff_dcadsp_init_arm(s);
}
Run Code Online (Sandbox Code Playgroud)
宏ARCH_ARM被定义为0.
当我在linux下编译它时,ff_dcadsp_init_arm()目标文件中没有函数,而它在windows下呢?所以我想确定编译器是否会对无用代码以及如何为INTEL编译器设置它做一些事情.