【问题标题】:C# GUI on top of C hard calculation engine基于 C 硬计算引擎的 C# GUI
【发布时间】:2015-06-19 00:04:42
【问题描述】:

前段时间,我用 C# 开发了一个数学绘图仪,它通过旧的“愚蠢”数值计算在各种几何空间中绘制函数。 用户只需插入一个经过简化和半编译的 n 变量方程或曲线,然后对域中变量值的整组组合进行计算,然后显示出来。

我正在优化算法以减少计算,但据我所知,对于我必须管理的问题,至少要进行 5*10^7 次操作,这至少是强大的机器和 C# 机器代码会导致 1-1.5 秒的延迟,这是不可接受的,至少因为用 C 实现的相同代码要快 20 倍(这只是未优化的版本!)。

所以我想做的是修改我的应用程序,保留 80% 的旧 C#“慢”代码,包括 GUI,因此将计算和渲染部分留给“快”C。“慢”部分必须将字符串和一些 int 参数传递给“快速”引擎,并接收回 1Mb 量级的 int 或字节数组。我读到有很多方法可以在 Windows 上实现这一点(将 C 放入主 c# 应用程序通过 P/Invoke 调用的 dll 中,构建两个不同的可执行文件通过管道或套接字“对话”、共享内存、数据复制、等等等等),但我发现它们之间的比较很少。

标准是 1) 出色的性能(更少的数据交换延迟获胜),2) 简单性和使 C 代码尽可能保持纯净和简单的能力(没有像 c++/cli 这样的混合语言)。

那么,解决问题的最佳策略是什么?

【问题讨论】:

  • C++ 只是面向对象的 C,它不像 C# 那样管理内存。因此,C++(纯形式)具有 C 的优点,但比结构/过程 C 更容易使用。但这都是学术性的。我的建议是自己用一个小项目测试其中的一些。我知道 DLL 和 C# 可能存在一些棘手的问题,但我主要使用 Java、C、C++ 工作,因此无法真正发表专家意见。
  • 我认为共享内存 (IPC) 不太适合(很少有)。为什么不直接创建/查找一个 C 库来进行这些计算,并将它们导出到共享库 (DLL)?然后 C# 可以与这些函数交互。

标签: c# c windows performance


【解决方案1】:

由于您没有详细说明计算,因此很难说出最适合您的方法。
您是否使用了所有可能的“数学技巧”(我已经有一段时间没有在大学学习数值分析了,但是这方面有很多优秀的书籍)。
如果您想从应用程序中调用 C 代码,请记住两件事:
A. 如果你使用 IPC,它会减慢速度,除非你会调用一次输入,然后获取输出,不要从进程 A 向进程 B 进行 X 调用。

B. 如果您使用一个进程(C# 调用 C,这在 Java 中使用 JNI/JNA 是可能的,我知道在 C# 中也是可能的),请确保您的 C 代码是“稳定的”,就好像它崩溃一样,那么您的 C# 部分也会崩溃(在第一种方法中,只有“C 进程”在 C# 进程处于活动状态时崩溃(并且“C 进程”可以集群或使用看门狗自动启动)。

【讨论】:

    猜你喜欢
    • 2017-07-27
    • 1970-01-01
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-27
    • 2011-09-02
    • 2011-04-05
    相关资源
    最近更新 更多