代码之家  ›  专栏  ›  技术社区  ›  Allen Rice 0x6A75616E

基于.NET的应用程序能以这种方式运行吗?

  •  1
  • Allen Rice 0x6A75616E  · 技术社区  · 15 年前

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

    它所做的就是一个接一个地运行,对于我们内部没有开发的应用程序,它们运行得非常快,通常为10-30毫秒。

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

    通常,这些应用程序会做一些数据库工作和一些非常基本的文件修改(纯文本的东西)。我们甚至精简了一些应用程序,以查看是否正是.NET框架的开销使所有事情都变慢了,并且每个研究过它的人都得出了这样的结论:

    “.网速很慢,不适合 以这种方式执行。”

    我想知道这是不是真的,我可以使用什么技术来跟踪问题或者缓解延迟。我试过使用profiler,但到目前为止,我还没有看到一个profiler会重复执行命令行.NET应用程序,这就是我们要做的。大多数人只想运行一次可执行文件并附加到它上以对其进行配置。

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

    5 回复  |  直到 15 年前
        1
  •  7
  •   Peter Mortensen icecrime    15 年前

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

    给你。打包的本机应用程序可能没有与数据库通信。单凭这一点,即使是一个简短的查询也很容易需要10-30 ms+。

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

        2
  •  3
  •   Brandon    15 年前

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

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

    此外,如果使用ngen对程序集/程序集进行预编译映像,这将大大减少启动时间。

        3
  •  3
  •   Steve    15 年前

    从本质上讲,它并不慢,但任何操作的速度都只能和最慢的步骤一样快。启动某个东西有对象初始化等,但不是很慢。那么,空程序的性能数据是什么样的呢?如果这需要几秒钟的时间,我真的很想知道发生了什么。

        4
  •  1
  •   James Conigliaro    15 年前

    很难做出像“.NET应用程序很慢”这样的笼统声明。您可能有一些JIT问题,但是预编译它们可以解决这个问题。看看这些应用程序在做什么。如果他们正在与数据库交谈,那么需要一两秒钟来建立连接,执行查询,对其进行一些改动,然后退出。

    当你开始真正优化一个应用程序,在数据库连接和查询延迟之外,那么一个本地编译的应用程序将比一个.NET应用程序或Java应用程序或脚本运行得更快。这是假设本机编译的应用程序是高效编码和优化的。

        5
  •  1
  •   chris.w.mclean    15 年前

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