我的程序通过EmptyWorkingSet函数获得性能提升?危险吗?

时间:2011-04-21 17:17:32

标签: c# visual-studio performance

我们正在为餐馆开发自动化软件(使用VS.NET C#)。我们正在使用POS产品,其中大多数都有celeron或原子处理器,上面有512 mb或1gb ram。所以在开始时就知道我们无法获得更强大的PC(我看到像“为客户提供更好的PC”这样的建议:))。

我们有记忆问题。为了代表真实客户的购物车,我们使用面板,我们添加自定义控件来代表购物车中的产品。这意味着很多控件都添加到面板,然后删除(Panel.controls.Clear函数。)此方法导致内存泄漏,程序性能下降。搜索和谷歌搜索后,我发现Panel.Control.Clear()函数清除面板中的所有控件,但不清除内存中的控件。所以我禁用了面板来检查,并且wholaaa一切正常。没有内存泄漏了。所以我决定删除那个购物车面板来保存记忆。但后来我在这里找到了非常有用的建议,比如EmptyWorkingSet。

    [DllImport("psapi.dll")]
    static extern int EmptyWorkingSet(IntPtr hwProc);

    static void MinimizeFootprint()
    {
        EmptyWorkingSet(Process.GetCurrentProcess().Handle);
    }

然后我添加了代码,启用了购物车面板,它没有任何改变。性能仍然很好。没有内存泄漏,没有性能下降。但有些人在herehere中说,EmptyWorkingSet可能会导致Page Faults,这很危险。我正在测试程序,什么也没发生。它就像一个魅力。所以这些是我的选择

  1. 移除导致内存问题的购物车面板。
  2. 从cartPanel清除自定义控件后,从内存中删除自定义控件(我不知道怎么做,但我可以搞清楚)
  3. USE EmptyWorkingSet但它可能会导致页面错误(实际上我不知道Page Fault意味着什么)
  4. 你说什么

1 个答案:

答案 0 :(得分:1)

我认为问题在于,当您应该处理它们时,您正在清除控件集合。此外,请确保在清除控件之前解除对控件的任何事件处理程序,因为事件处理程序会在对象之间设置引用,因此事件的侦听器将导致其他符合条件的集合对象。在尝试强制清除工作集之前,我会走那条路。