【问题标题】:signal processing: C++ vs C#信号处理:C++ 与 C#
【发布时间】:2025-12-08 02:05:02
【问题描述】:

我想构建自己的信号处理库,可能还有另一个关于图形算法的库。我发现 C# 在与内存分配、指针、线程等相关的可能错误方面非常有用和强大......

但我想知道在性能方面我会损失多少。这会是可以接受的吗?

谢谢

【问题讨论】:

    标签: c# c++ performance


    【解决方案1】:

    当我开始我的 DSIP 课程时,我是一名纯 C# 开发人员。看了一段时间后,我最终使用了 C++ 库并学习了 C++,这最终对我有利,因为我正在做实时图像处理,而 C# 的性能无法与之匹敌。

    事实上,您可以运行一个快速测试并运行一个由 C# 和 C++ 中的几个乘法组成的数学方程一百万次,然后就会看到使用浮点数进行计算的巨大差异。

    如果你幸运的话,你会在 C# 中获得包装器,这是两全其美的,在 C++ 中快速计算并且在 C# 中易于使用。 OpenCV 有一个 C# 包装器,看起来相当不错 (http://www.emgu.com/wiki/index.php/Main_Page)。

    我强烈推荐 OpenCV,尤其是用于 2D 信号处理。它的性能很棒,使我的项目成为可能。在此处查看演示:http://www.youtube.com/watch?v=NeQvcdRPxoIhttp://www.youtube.com/watch?v=NqYPJELHkhA

    【讨论】:

    • +1 对包装器的好想法......我已经很久没有使用过包装器了,我往往会忘记它们的存在。
    • C++ 中是否有任何“事实上的”信号处理标准?
    【解决方案2】:

    有了合适的硬件,你应该不会有问题。

    需要考虑的一点是:我可以毫不费力地找到一个库来用 C++ 进行信号处理。但是,我根本找不到太多关于 C# 信号处理的信息。

    如果您能找到让它发挥作用的方法,那么您可能刚刚找到了进入一个可以让许多其他人受益的利基开发领域的方法。

    只是想一想。除非您在某些关键任务系统上执行此操作,否则这两种方法都可能无关紧要。从长远来看,我会选择你认为对你更有利的任何东西。

    【讨论】:

    • 我经常看到这样的评论,“使用正确的硬件,你不应该有问题”,相当于“使用正确的硬件,不应该有性能损失”。我不同意这一点,仅仅是因为购买 PC、维护它们、提供足够的内存等等都需要花钱。所以从这个非常真实的角度来看:使用低效的语言和/或库确实需要花钱。为什么有人会说“更好的硬件”可以解决问题,而不是看问题的算法方面,这是大多数人在询问性能时会问的问题。
    • @Werner:同意,并且喜欢用垃圾收集语言 (C#) 实时添加它是不可能的。
    【解决方案3】:

    与其说是 C# 中的性能损失,不如说是执行垃圾收集的时间的不可预测性。在 GC 期间,所有托管线程都被冻结,直到 GC 完成。在此期间,您无法进行任何处理,这对于 99% 的应用程序而言无关紧要,但对于信号处理而言至关重要。这就是为什么您看不到 Microsoft 认可的 DirectShow 托管版本或其他“实时”信号处理应用程序的原因。

    【讨论】:

    • 类似于垃圾收集器,您也无法预测 malloc 或 new 何时会遍历空闲链并合并内存。如果绝对需要,您可以控制 GC 的运行时间。
    • GC 通常只需要 20-30ms。所以应该没问题。
    • Ankur:这就是为什么你会使用内存领域 /preallocate 而不是使用常规 malloc 的原因之一,所以我认为这不重要。
    • @Aliostad:你怎么知道的?我认为这取决于系统是否是例如避免碰撞的汽车驾驶员辅助系统。那么 30 毫秒就很关键了。