-5

所以这就是现在的情况:我有一个 C# GUI 项目和一个 C# 引擎项目在同一个解决方案中。GUI 允许与用户交互,一些高级别的东西等。引擎的功能是与另一个第三方应用程序通信。Engine 具有连接到第三方应用程序的套接字,也具有将消息转换为对象、将其发送到第三方应用程序、侦听第三方应用程序的响应并做出相应反应的方法。引擎和第三方应用程序之间要通信的数据被打包到对象中。C# 引擎的问题是它太慢了。所以这个想法是将引擎转换为非托管 C++ 以提高速度。这是我的攻击计划:

  1. 手动将整个 C# 引擎翻译成 C++(这已经相当令人生畏,因为 C# 引擎包含线程和哈希表)
  2. 使用以下内容替代 C++ 中的构造函数、访问器和修改器:

    void* CreateInstance()
    {
        MyClass* p = new MyClass();
        return p;
    }
    
    void ReleaseInstance(void* pInstance)
    {
        MyClass* p = (MyClass*)pInstance;
        delete p;
    }
    
    int GetData(void* pInstance)
    {
        MyClass* p = (MyClass*)pInstance;
        return p->GetData();
    }
    
    void SetData(void* pInstance, value)
    {
        MyClass* p = (MyClass*)pInstance;
        p->SetData(value);
    }
    

    (我不能在 C++ 中使用真正的类的原因是因为你不能在 C# 中实例化 C++ 对象)

  3. 然后构建一个 C++ 非托管 DLL,在 C# GUI 项目([DllImport 等])中使用 P/Invoke 来访问所有 C++ 方法,并使用它来替换 C# 引擎。对象将使用方法进行模拟,并在 C# GUI 和 C++ 引擎之间来回传递。

在我开始这项耗时的任务之前,是否有任何 C# 代码无法翻译成 C++,然后通过这种方法重新导入 C# GUI?

4

1 回答 1

2

不会有任何 C# 代码不可能翻译成 C++。不过,您可能想查看 .NET 中是否有任何您将使用的 C++ 库未涵盖的库函数。确保您不会被任何需要重新发明的轮子卡住。

也就是说,在我的实践经验中,真实世界的 C++ 代码并不自然地比真实世界的 C# 代码快。确实,C++ 程序员有更多可用的技巧可以让他们获得更好的性能,但达到这一点所涉及的努力通常是相当艰巨的。考虑一下著名的Rico Mariani 和 Raymond Chen 之间的竞争案例。Chen 的最终版本比 Rico 的优势最终归结为 .NET 运行时需要引导自身的时间。对于长时间运行的进程来说,这是可以忽略不计的一点开销。

因此,我强烈建议您尝试花一些时间使用性能分析器,首先了解 C# 代码为何缓慢,以及您可以采取哪些措施来加快速度。很可能通过走这条路线,您只需花费很少的精力就可以让代码运行得足够快,以满足您的需求。令人惊讶的是,仅选择更好的数据结构就能让人印象深刻。

于 2012-05-18T22:09:42.457 回答