【问题标题】:How can I decrease startup and running time in .net applications?如何减少 .net 应用程序的启动和运行时间?
【发布时间】:2010-01-15 16:23:38
【问题描述】:
我使用 C# 编写带有 .NET 框架的 Windows 应用程序。如何减少这些应用程序的启动时间?我的应用程序在启动和初始化期间感觉很慢,尤其是在显示初始表单时。
我的应用程序使用 Access (MDB) 数据库来保存数据。在某些表单中,它会加载数据,但应用程序第一次显示任何给定的表单时,需要很长时间才能显示。
我尝试使用 NGen 来减少启动时间,但它并没有像预期的那样帮助我。
【问题讨论】:
标签:
c#
performance
startup
ngen
【解决方案1】:
确保您的应用程序在启动时做的工作尽可能少。
您可以更改启动代码以将启动任务推迟到辅助线程。
我会给出一个更详细的答案,但你的问题很宽泛,不够详细。
【解决方案2】:
首先你需要诊断在这个启动期间运行了哪些函数,并分析每个函数消耗了多少启动延迟...
然后,一旦您知道,如果其中一个或两个占用了大部分时间,并且不涉及最初显示的 UI 屏幕,请在单独的线程上执行这些功能。
【解决方案3】:
查看延迟加载。这涉及在首次请求数据时加载数据并填充类,而不是在实例化类时。
// member variable
private DataSet _employeeDataSet = null;
// property
public DataSet EmployeeDataSet
{
get
{
if (_employeeDataSet == null)
_employeeDataSet = GetEmployeeDataSet();
return _employeeDataSet;
}
}
【解决方案4】:
您可能希望使用EQATEC Profiler 来分析您的应用程序并查看哪些函数调用需要很长时间。它可以更轻松地可视化后台发生的事情以及可以改进的地方。
【解决方案5】:
我在一个使用 C# 构建 .NET 应用程序的团队中,我们一直遇到这种情况。有一个分析器,但没有人愿意使用它,因为 1)它有点麻烦,2)输出令人困惑。我所做的是在 IDE 下启动它,虽然它运行缓慢,但我只是暂停它并通过检查调用堆栈询问它在做什么以及为什么。
由于它的速度比预期的要慢,这是因为它正在做一些将被删除或以不同方式完成的事情。这些事情通常由函数调用组成,请求诸如:国际化不需要国际化的字符串,多次加载,初始化数据结构,这些数据结构只是为了完整性,稍后将被替换,解压缩和压缩更多的东西必要的。所有这些都采用堆栈中函数/方法调用的形式,当它们出现在多个堆栈样本上时,它们都需要被关注。
尝试预见这些问题而不是把它们放进去是很好的,但你可以指望这些问题会悄悄出现,尽管有最好的意图。 stack sampling (stackshots)的方法可以有效的找到它们。
【解决方案6】:
This MSDN article 有很多有用的提示,尤其是对于 .NET 2.0 应用程序。
我在那里学到的最有用的事情是在父窗体上调用 SuspendLayout() / ResumeLayout() 是不够的,您可能需要在包含许多子对象(例如树,或者在我的情况下)的子控件上调用 BeginUpdate() / EndUpdate()基础设施工具栏管理器)。在我的 ToolbarManager 上使用 Begin / EndUpdate 可缩短启动时间 3 秒!