【问题标题】:Should I go with C# / .Net OR C++ for my application?我应该为我的应用程序使用 C#/.Net 还是 C++?
【发布时间】:2010-10-25 11:12:41
【问题描述】:

我正在做一个与SQL Server 对话的项目,大部分后端代码都在C++ 中。

这是一个应用程序,可在将少量流体装载到载体中时控制它们的流动。一些与控制器对话的后端模块反过来控制流体的流动在C++。由于它们存在内存泄漏和其他一些错误,因此已尝试将它们迁移到.Net。

我的理解是,当我们将.Net 用于后端模块时,性能会下降。所以我的意见不是将这些后端模块转换为 .Net,而是解决 C++ 本身的问题。

讨论的代码是一个与控制器固件交互的应用程序。它基本上需要一些命令并从控制器获得响应。此代码没有 UI,并且相同的代码也与 SQL 交互以更新数据。两者都是一个exe的一部分。

.Net 在预期性能不严格时被认为是好的。如果必须编写新代码,尤其是涉及 UI 设计时,这将是合适的。另一种思想流派是,.Net 适用于较高层,但不适用于多层架构中的较低层。

我想从不同的角度了解其他人的意见。需要考虑的一些方面是:

  • 速度
  • 代码的可维护性
  • 未来与迁移相关的风险
  • 等

请从重写现有代码的角度发表评论。如果我们决定这样做,这将是一对一的 C++ 行到 C# 的转换。

【问题讨论】:

  • 好的。但问题是什么?在你的情况下,我认为 C++ 是要走的路。仅仅因为您有内存泄漏或错误,您就不会想到逃避它并使用 C#。如果您没有正确测试它,您可能会产生相同的错误(甚至更糟); C++ 或 C# 无关紧要。对于内存问题,请使用“valgrind”(谷歌了解更多)等工具分析您的代码。
  • 确实,.NET 应用程序比写得不好的 C++ 应用程序运行得更好。但听起来 C++ 是要走的路,尤其是在引用直接硬件交互时。请记住,.NET 可能存在内存泄漏(例如,将某些内容添加到集合中并忘记它)。我绝对同意 Abhay 的观点,即你不应该仅仅因为 /your company's/ C++ 到目前为止一直很差就放弃 C++。
  • 我不知道您所说的“驱动程序”是什么意思:通常,说“驱动程序”和“与固件交互”意味着“内核模式”软件,但我没有听说过内核模式驱动程序也与 SQL 交互。
  • 我误解了这个问题......不要重写 - 只需修复错误和泄漏。除非你有充足的时间并且缺乏优秀的 C++ 开发人员,否则不要在 .Net 中重写
  • “驱动程序”一词可能具有误导性。让我纠正一下。有问题的代码是“与 RS485 端口上的控制器固件对话的应用程序。

标签: c# c++ performance optimization porting


【解决方案1】:

快速回答:

如果您有能够使用调试器并了解他们的应用程序域以及如何使用控制器的有能力的 C++ 程序员,那么仔细审查并修复内存错误和问题可能会更容易。毕竟,代码已经花费了时间和精力,除非是琐碎的代码,否则用 C# 重写可能会引入新的逻辑错误。

OP 的问题:

讨论的代码是与控制器固件交互的驱动程序代码。它 基本上需要一些命令并得到控制器的响应。此代码没有 UI 和相同的驱动程序代码也与 SQL 交互以更新数据

您是在谈论您命名为“驱动程序”的用户模式软件,还是在谈论内核模式设备驱动程序?

如果您能提供有关这些控制器运行控制流体流动的固件的更多信息,将会有所帮助。 C++ 后端是否通过 RS232(串行)连接到控制器?以太网? USB? TCP/IP? PCI?

如果您通过 TCP/IP 或 RS232(串行)连接到控制器硬件,C#/.NET 可以很好地处理该任务。对于 USB、PCI、以太网等其他任何东西,您将需要一个设备驱动程序,该驱动程序必须根据驱动程序的要求用 C 或 C++ 编程。当然你可以封装C++中的用户态部分或者封装直接调用Win32,但是会给你的项目增加更多的开发任务。

【讨论】:

  • “驱动程序”一词可能具有误导性。让我纠正一下。有问题的代码是“与 RS485 端口上的控制器固件对话的应用程序”。该控制器是专有的,不在公开市场上出售。确切的问题是,我们需要向固件发送大量命令并获得响应。肯定会涉及到网络的延迟。但是.Net 会增加速度吗?
  • 对于 RS485,.NET 无疑是一种选择。它不应该真正增加任何开销或使 I/O 比使用 C++ 慢。我已经使用 C#/.NET 通过 RS485 控制机器,这当然可以胜任这项工作。如果您担心速度,那么与任何类型的 I/O 一样,异步 I/O(可能带有回调)将使您的应用程序更高效,但代价是它也会显着增加复杂性你的代码。在决定用 C# 重写之前,我想你先判断一下为什么会发生内存泄漏。是设计错误吗?还是只是程序员的错误?
【解决方案2】:

显然,现有 C++ 代码的唯一问题是内存泄漏。

在我看来,用 C# 重写它的理由不足。

我建议运行内存泄漏检测软件来查找泄漏。

【讨论】:

    【解决方案3】:

    每种语言都有其特殊性,您应该找出最适合该场景的语言

    【讨论】:

    • 但这正是我想知道的。我想知道我们需要考虑哪些不同方面。
    • 平台性能资源,如果您要为 diff 操作系统创建应用程序,那么您现在不能使用 C#,除非您使用 Mono 之类的软件,如果您正在为 Windows 设计它以进行系统交互那么VC++是最好的选择
    • 我看不到任何其他操作系统在不久的将来会出现。它仅适用于 Windows(XP 和未来版本)。
    • 好吧,如果你必须与数据库交互,.net 是最好的,因为它有大量支持数据库交互的类,但如果你想与系统交互,我认为 c++ 甚至需要 .net 中的生产时间。净少
    • 您能否澄清一下您所说的“.net 中所需的生产时间甚至更少”是什么意思?您的意思是在.net 中编写代码所花费的时间比 C++ 少。这方面无关紧要,因为 C++ 中有代码。我试图找到用 .net 编写是否有任何额外的优势。
    【解决方案4】:

    不要因为一些错误而用不同的语言重写整个程序 - 新产品中只会有不同的错误,并且必须重新启动问答周期。我会修复 C++ 程序中的错误。如果问题是内存管理,我会强烈关注std::auto_ptr 或std::tr1::shared_ptr,它们会在完成后自动为您删除内存。如果这不是一个选项,我敢肯定,通过 valgrind 运行某些东西,甚至为商业内存检查器付费会比重写整个东西便宜(在时间和金钱上)。

    【讨论】:

      【解决方案5】:

      “语言有其独特之处”我需要一个拥抱,真的。不要因为代码写得不好而改变语言……编写更好的代码并使用可用的资源。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多