【问题标题】:Can .NET based applications be expected to perform in this manner?可以期望基于 .NET 的应用程序以这种方式执行吗?
【发布时间】:2009-11-27 06:27:43
【问题描述】:

我们有一个“打印引擎”,它基本上选择预定义的任务来针对文件运行,这些“任务”是 .NET 2.0 - 3.5(在 C# 中)命令行应用程序。

它所做的只是一个接一个地运行,并且使用我们尚未内部开发的应用程序,它们运行得非常快,通常为 10-30 毫秒。

但是,我们的 .NET 应用程序通常需要 1-3 秒,当您处理每个文件和多个文件的多个可执行文件时,所有这些都同步执行,我们最终会等待很长的时间。

通常这些应用程序会做一些数据库工作和一些非常基本的文件修改(纯文本内容)。我们甚至剥离了一些应用程序,以查看是否只是 .NET Framework 的开销导致一切变慢,并且每个研究过它的人都刚刚得出结论

".NET 很慢,而且不是为了 以这种方式执行。”

我想知道这是否属实,以及我可以使用哪些技术来追踪问题或缓解滞后。我尝试过使用分析器,但到目前为止,我还没有看到会重复执行命令行 .NET 应用程序的分析器,这就是我们所做的。大多数人只想运行一次可执行文件并附加到它以对其进行分析。

理想情况下,我们希望完全不使用打印引擎并开发我们自己的更高效的引擎,但这不会发生。

【问题讨论】:

  • 只是一个参考(不想编辑帖子并引起颠簸),我将对此进行性能测试,并在有时间时用实数和 sn-ps 更新问题。我没有忘记它:)

标签: c# .net performance


【解决方案1】:

通常这些应用程序会做一些数据库工作

你去。打包的本机应用程序可能不与数据库通信。即使是一个简短的查询,仅此一项就很容易花费 10-30 毫秒以上的时间。

此外,.NET 确实需要一些额外的开销来建立应用程序域。如果您可以将一些小型应用程序分组为更少的大型应用程序,或者使用命令行参数将它们配置为一次运行多个任务,您可能会发现事情会更好。

【讨论】:

    【解决方案2】:

    大多数(全部?).NET 减速都与程序集加载和 JIT 编译有关。

    如果您可以将多个任务组合到命令行中,那将使其运行得更快。请记住,当您为单个任务反复执行命令行应用程序时,您每次都在动态加载和编译每个程序集及其所有资源。

    此外,如果您使用 NGEN 制作程序集/程序集的预编译映像,这将大大减少启动时间。

    【讨论】:

    • jit 每台机器只发生一次。由于这些经常运行,我怀疑 ngen 会有所帮助,甚至可能会减慢速度,因为它们不再使用特定于机器的优化。
    • 除非程序集是 NGENed,否则每次第一次调用方法时都会发生 JIT。如果你重启同一个应用,同样的方法会再次被 JITted。
    【解决方案3】:

    本质上,它并不慢,但任何操作都只能与最慢的步骤一样快。启动某些东西有对象初始化等,但不是那么慢。那么,空程序的性能数字是多少?如果这需要几秒钟,我真的想知道发生了什么。

    【讨论】:

    • 我会跟进一些具体的数字和代码 sn-ps,因为我真的很想深入了解这一点
    • +1 用于首次使用空应用程序进行测量,这将显示开销是否真的在 .Net 的“开销”中(我会怀疑)...
    【解决方案4】:

    很难做出诸如“.net 应用程序很慢”之类的笼统陈述。您可能会遇到一些 JIT 问题,但预编译它们可以解决这些问题。看看应用程序在做什么。如果他们正在与数据库交谈,那么需要一两秒钟来建立连接,执行查询,对其进行某些操作,然后退出。

    当您开始真正微调应用程序时,除了数据库连接和查询延迟之外,本机编译的应用程序往往会比 .net 应用程序或 java 应用程序或脚本运行得更快......这是假设本机编译的应用程序经过高效编码和优化。

    【讨论】:

      【解决方案5】:

      我会改变您从打印引擎调用这些任务的方式。听起来您是从命令行/创建过程运行它们?如果是这种情况,您可以在打印引擎启动时将它们加载到您的应用程序域中,然后使用相关参数调用它们的 Main 方法。这将大大减少 JIT 和加载时间。

      【讨论】:

      • 很有趣,所以我们仍然有我们的命令行应用程序,但它们只是调用已经加载到应用程序域中的东西?
      • 是的,您可以将任何 .net 程序集(exe 或 dll)加载到应用程序域中。然后,您可以通过反射访问他们的方法,因此您可以使用正确的字符串参数调用他们的 Main 方法。
      • 您可能希望在一个新线程上执行 main 方法,可能来自线程池,否则您的引擎将最终成为单任务...
      猜你喜欢
      • 1970-01-01
      • 2011-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-19
      • 1970-01-01
      • 2021-12-13
      相关资源
      最近更新 更多