【发布时间】: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