性能关键GUI应用程序(windows,linux)

时间:2008-08-13 14:00:55

标签: .net windows linux user-interface

我的任务是更新一系列应用程序,这些应用程序是性能关键的VB.NET应用程序,基本上只是监视和返回网络统计信息。我只有三个要求:将其转换为C#,使其快速,并使其稳定

有一点需要注意,我们“可能”从.NET平台迁移到Linux “很快”

我将负责维护这些应用程序,所以我想这样做。我决定根据MVP模式重构这些应用程序,以便我可以正确地测试这个坏男孩的地狱。但我也在想,因为我使用MVP,我也可以在本机C / C ++代码中执行计算上昂贵的东西,而GUI可以使用.NET表单,或Qt或其他任何东西。

问题:

  1. 在winforms中执行GUI是否有意义,但在本机非托管C / C ++中使用昂贵的东西?

  2. 有关适合上述情况的优秀跨平台窗口套件的任何建议吗?

12 个答案:

答案 0 :(得分:5)

首先,我会花点时间尝试一些VB.NET to C# converters。你基本上是移植语法,如果你不需要,没有理由手工完成。当然,您可能需要清理转换器的内容,但这比手动转换更好。

现在,关于你的问题:

  

1)在winforms中执行GUI是否有意义,但在本机非托管C / C ++中使用昂贵的东西?

还没有。等到你完成转换,然后找出你实际花费时间的地方。在您发现它是必要的之前,没有理由将C / C ++与C#混合。您可能会发现陷入不安全的C#就足够了。即使这可能是不必要的。您可能只需要优化算法。找出你的瓶颈是什么,然后决定如何解决它们。

  

2)对于适合上述情况的良好跨平台窗口套件的任何建议?

我肯定会关注mono。如果你要使用C#,这真的是你能做的最好的事情。当你转移到Linux时,它几乎可以是单声道或另一种语言的另一种重写。

答案 1 :(得分:4)

1)过早优化是邪恶的。在C#中实现你的“昂贵的东西”,看看你是否需要重构它。或者,至少设置一个允许您确定的测试。

2)Yowch。跨平台UI。我不会忍受“可能”的东西。把黄鼠狼钉在下面;如何在不知道自己设计的情况下做出设计决策?如果你使用纯.NET实现,如果你必须(至少)重构它以在Mono中工作,他们会抱怨吗?如果你用Java创建它,他们会不会觉得它看起来很难看,因为地狱和用户抱怨他们无法在所有那些.jars中找到他们的.exe文件?

答案 2 :(得分:3)

1)不一定。我认为用C ++编写后端代码可能是值得的,无论性能如何。即使你不能把你的高层人员放在平台交换机上,你也应该谨慎地为这种可能性做好准备,因为管理类型往往会在没有充分理由(或警告)的情况下改变主意。即使他们现在决定不转换,这并不意味着他们不会决定从现在开始六个月。现在用C ++编写你的逻辑,知道它是一种可能性,虽然更难,但可能会让你以后的生活变得更加轻松。

2)不是真的。有像wxWindows和GTK#这样的“解决方案”,但通常它们都是错误的,或者很难正常工作,或者它们在一个平台或另一个平台上缺少重要的东西。它们通常还会将您锁定在最低公分母UI中(即,一般控件工作正常,但您可以忘记做一些有趣的事情 - 例如WPF)。 UI很容易编写,所以我认为如果你用可移植的东西编写你的逻辑,那么将几个特定于平台的UI拼凑起来应该是一件小事。

答案 3 :(得分:2)

对于第一个问题,很难说它是否有意义,因为它可能取决于你需要获得什么样的性能。我个人还没有看到由于使用WinForms设计合理的GUI中的GUI导致任何系统范围的减速,所以我不明白它为什么会导致任何问题,并且很可能会让你的生活更轻松

关于你的第二个问题,如果你将要在某个时候转移到另一个平台 - 你想看看由Mono(http://www.mono-project.com/Main_Page)实现的库,这也应该包括您在跨平台窗口方面的大部分需求,因为它支持WinForms和GTK#。

答案 4 :(得分:2)

不,在C / C ++中做“昂贵的东西”是没有意义的。与C#相比,潜在的(并且很可能是次要的)性能提升永远不会超过你的生产力,这是一个令人讨厌,生病的笑话。真。它甚至都不是很接近。

仔细阅读(及其中引用的所有帖子): http://blogs.msdn.com/ricom/archive/2005/05/10/416151.aspx

答案 5 :(得分:2)

您可能希望了解如何使用Mono。这是.NET的开源版本,可在许多平台上运行...... Linux,Mac,Solaris,Windows等。

现在用C / C ++编写昂贵的东西。这是一篇非常好的文章 解释C/C++ & C# performance之间差异的工作。

答案 6 :(得分:1)

  

再次,让我强调一下,C ++的东西很昂贵。做上面提到的事情会有意义吗? (.NET形式隐藏繁重的C ++)

如前所述,在个人用VB.NET和C#编写的应用程序中,由于WinForms的原因,我个人没有注意到任何系统范围的减速。但是,如果应用程序是真正的性能密集型,那么如果您在C#中编写了所有内容,由于它被编译为CIL(http://www.cl.cam.ac.uk/research/srg/han/hprls/orangepath/timestable-demo/),您可能会注意到轻微的减速。因此,使用诸如C#之类的语言编写GUI可能会使开发的这一部分变得更容易,这将使您有更多时间来处理代码的关键部分。由于从C#代码调用C / C ++代码,这里唯一的catch-22可能会注意到一些减速;但是,这很可能不太可能。

答案 7 :(得分:1)

  

1)在winforms中执行GUI是否有意义,但在本机非托管C / C ++中使用昂贵的东西?

很可能不是。除非你与许多其他本机C dll等进行通信,否则C#可能比C ++慢5%到<5% (如果你',std :: string真的会杀了你重新使用它)

  

2)对于适合上述情况的良好跨平台窗口套件的任何建议?

如果它只是一些带按钮的简单形式,则mono可能无需修改即可运行它们。它支持.NET WinForms这些天非常好。然而,它很难看: - )

答案 8 :(得分:0)

我可能误解了这个问题,但如果是网络监控系统,为什么不把它写成“专用”Windows服务?

VB.NET不应该比C#慢得多。我不是百分之百确定生成的IL代码是否有任何重大差异,但唯一的优点(以及在C#中重写它的合理理由)我能想到(除了C#有更好的语法和其他一些好东西)是使用不安全的代码块,可以加快一点。

答案 9 :(得分:0)

c / c ++的东西可能最终成为一个好主意,但现在YAGNI。与Linux的东西相同。忽略它,you ain't gonna need it直到你需要它为止。保持simple。正如你所说,单位测试它的地狱。从那里获取代码并evolve the design

答案 10 :(得分:0)

一段时间以来我遇到了类似的困境,同时试图找到一种最好的方法来开发基于PC的H / W测试工具(显然意味着“有UI选项”),它与嵌入式硬件交互(通过PCMCIA接口)

瓶颈是测试应该与测试人员指定的预定时间之间的最大偏差为10毫秒。

例如:如果测试人员创建了以下测试序列:

    1.远程激活H / W
    2.等待50ms延迟 3.阅读H / W信息

    步骤2中提到的延迟不应该是> 60ms的。


    我选择C ++ WIN32应用程序作为我的后端和VC ++ 2005 Winform(.NET平台)进行UI开发。有关如何将这两者联系起来的详细信息,请参见msdn
    我这样隔离了系统:
    在VC ++ .NET中:

      1. UI以获得有关H / W的完整信息(通过后端应用程序读取)并根据需要控制H / W. (按钮,组合框等..等等。)
      2.用于运行时间关键测试序列的UI(如上例所示) 3.收集这些信息并以时间线性格式构建流(文件流)(即,按照必须执行的步骤的精确顺序)。
      4.使用WIN32后端应用程序触发和握手机制(通过重定向标准输入和标准输出)。公共资源将是文件流。

      在C ++ WIN32中:

        1.解释输入文件流。
        2.与H / W的互动。
        3.从H / W收集信息并将其放入其输出文件流中 4.指示测试完成UI(通过重定向标准输出)

        整个系统已启动并正在运行。它看起来很稳定。 (没有上面提到的时间偏差)。
        请注意,我们使用的测试PC仅用于H / W测试目的(它只有在其上运行的UI,没有自动更新,病毒扫描等等。)。

答案 11 :(得分:0)

gtk-sharp是一个非常好的跨平台工具包。

  

Gtk#是单声道和.Net的图形用户界面工具包。该项目绑定gtk +工具包和各种GNOME库,使用Mono和.Net开发框架实现完全本机图形Gnome应用程序开发。