2009-07-28 46 views
1

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

它所做的只是一个接一个地运行,而对于我们还没有在内部开发的应用程序,它们运行得非常快,通常为10-30毫秒。但是,我们的.NET应用程序通常需要1-3秒,而当您处理每个文件和几个文件的多个可执行文件时,所有文件都会同步执行,所以我们最终会等待很长的等待时间。

通常这些应用程序正在做一些数据库工作和一些非常基本的文件修改(纯文本的东西)。我们甚至已经剥离下来,为了某些应用中,看它是否只是已经看着它这是拖慢一切.NET Framework和每个人的开销刚刚得出的结论是

”。NET就是慢并不是以这种方式执行 。“

我在想,如果这是真的,我可以用什么技术来追踪问题或减缓滞后。我试过使用探查器,但到目前为止,我还没有看到一个会重复执行命令行.NET应用程序,这就是我们所做的。大多数只是想运行一次可执行文件并附加到它来分析它。

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

+0

只是一个fyi(不想编辑帖子并造成碰撞),我将对此进行性能测试,并在获得时间时用实数和片段更新问题。我没有忘记:) – 2009-08-27 13:30:33

回答

7

通常,这些应用程序在做数据库的工作

有一点点你走。打包的本地应用程序可能不会与数据库交谈。即使只是一个短的查询,单单就可以轻松地花费10-30毫秒。

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

3

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

如果您可以将多个任务组合到命令行中,这将使其运行速度更快。请记住,当您一次又一次地执行一个命令行应用程序时,您会每次动态加载并编译每个程序集及其所有资源。

此外,如果您使用NGEN编译程序集/程序集的预编译映像,这将显着缩短启动时间。

+1

jit只在每台机器上发生一次。由于这些经常运行,我怀疑ngen会提供帮助,甚至可能会减慢速度,因为他们不再使用机器特定的优化。 – 2009-07-28 18:32:04

+0

感谢您的信息乔尔! – 2009-07-28 18:37:54

+0

除非程序集为NGEN,否则每次首次调用某个方法时都会发生JIT。如果你重新启动同一个应用程序,同样的方法会再次被打印。 – 2009-11-26 22:31:09

3

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

1

很难做出像“.net应用程序很慢”这样的一揽子声明。你可能会遇到一些JIT问题,但是预编译它们可以解决这个问题。看看应用程序在做什么。如果他们正在与一个数据库交谈,那么希望有一两个人建立连接,执行查询,做一些事情,退出。当你开始真正微调一个应用程序,而不是数据库连接和查询延迟时,那么一个本地编译的应用程序往往会比.net应用程序或一个Java应用程序或脚本运行得更快......这是假设本机编译的应用程序已经进行了有效编码&优化。

1

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

相关问题