C# GUI 位于 C 硬计算引擎之上
本文关键字:引擎 计算 GUI 位于 | 更新日期: 2023-09-27 17:57:14
前段时间,我用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 代码,请记住两件事:
一个。如果使用 IPC,它可能会减慢速度,除非您对输入进行一次调用,然后获取输出,否则不要从进程 A 到进程 B 进行 X 调用。
B.如果你使用一个进程(C#调用C,这在使用JNI/JNA的Java中是可能的,我知道在C#中也是可能的),确保你的C代码是"稳定的",就像它崩溃一样,那么你的C#部分也会崩溃(在第一种方法中,只有"C进程"崩溃而C#进程处于活动状态("C进程"可以集群或使用看门狗自动启动)。