c# - EXE的大小会影响执行速度吗?

标签 c# vb.net dll

我将创建一些命令行工具来使用一些大型库 DLL。出于安全原因,我计划将 DLL 嵌入命令行的 EXE 中。

例子: 假设 CL(命令行工具)的功能只是将文件从 A 复制到 B。执行此操作的过程包含在一个 100MB 的库 DLL 中。如果我只是从 DLL 中取出代码行并将它们粘贴到 CL 的代码中,那么 CL 将只有 10Kb。 但我不想那样做,所以我将完整的库嵌入到 CL 的 EXE 中,这将使它的大小达到 101MB。

请注意,以上仅为示例。我曾经在某处(不记得在哪里)读到 Windows 只会使用实际使用的 EXE 部分。因此,如果这是真的,那么 EXE 大小是 10Kb、100MB 还是 1GB 都无关紧要。我不知道这是不是真的,所以我才问这个问题。

我拥有 DLL 的代码,所以如果最好的解决方案是不包含整个 DLL,而只是链接到或包含 CL 使用的 DLL 项目的那些代码文件,那么我会这样做方式。

所以问题是:10Kb 的 CL 会比 101MB 的 CL 运行得更快并且消耗的内存更少吗?

最佳答案

首先,如果您出于安全原因将额外的 dll 嵌入到可执行文件中,则不要这样做。

如果程序可以解压它,其他任何人都可以,所以如果您认为这会提高安全性,那您只是在自欺欺人,除非您谈论的是工作安全

其次,我怀疑这里的根本问题比其他人想象的要难回答。

如果您使用了常规的非托管可执行文件和非托管 dll,那么当您启动程序时,这些文件的一部分将保留在内存空间中,但只有您使用的实际位会被映射到物理内存。

换句话说,程序消耗的实际物理内存量将与您使用的代码量以及代码的分布方式成正比。我说“有点”是因为分页到物理内存是在页面的基础上完成的,并且页面有固定的大小。因此,一个 100 字节的函数可能最终将一个 4KB 的 8KB 页面(我不记得页面的大小了)映射到内存中。如果您调用大量此类函数,并且它们分布在代码的地址空间中,您可能最终会在大量物理内存中映射少量代码。

对于托管程序集,情况有所不同。托管代码没有以相同的方式直接映射到物理内存(注意,我在这里的细节很模糊,因为我不知道确切的细节),因为代码还没有准备好运行。在它可以运行之前,它必须被 JITted,而 JITter 只在需要 jit 的基础上 JITs 代码。

换句话说,如果您在程序集中包含一个庞大的类,但从未使用它,它可能永远不会被 JITted 结束,因此不会使用任何内存。

那么答案是“否”,因为它不会使用更多内存?

我不知道。我怀疑更大的程序集、将更多元数据放入反射表或诸如此类的东西会有一些影响。

但是,如果您打算将其放入可执行文件中,则需要在加载之前将其解压缩到磁盘(这将“规避”您的“安全功能”),或者将其解压缩到内存中(这将需要所有那 100MB 的物理内存。)

因此,如果您担心使用大量内存,这是我的建议:

  1. 试一试,看看有多糟糕
  2. 决定是否值得
  3. 并且不要将额外的程序集嵌入到可执行文件中

关于c# - EXE的大小会影响执行速度吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5673770/

相关文章:

C# - 尝试将字典转换为 JSON

c# - 字符串数组搜索

c# - 线程间基于回合的同步

vb.net - 准确的 Windows 计时器? System.Timers.Timer() 限制为 15 毫秒

asp.net - 防止某些页面在 ASP.NET 中直接访问

c# - 处理方法中的已知错误和错误消息

jquery - 是否可以更改 JSON 中的页面 webmethod 响应,删除 .d 节点?

c++ - dll相关的问题

c# - 如何调用 scanf 而不是 Console.ReadLine()?

c# - 如何允许两个具有相同 namespace.class 的 DLL 存在于同一个应用程序中?