代码之家  ›  专栏  ›  技术社区  ›  ssube

优化托管到本机呼叫

  •  10
  • ssube  · 技术社区  · 14 年前

    如何加快从托管代码调用本机方法的速度?

    我正在编写一个程序,它需要能够管理任意大小的对象列表,并从中高速检索信息,并将其输入脚本。脚本是经过编译的C代码。我正在编写一个从C++(原生)DLL/SO/ETC到C(.NET或MNO)管理层的基本接口层。

    现在,我已经做了一些测试,我发现从托管代码中pingvo一个本机方法的速度平均比在托管代码中慢100倍(所有本机方法和所有托管方法的速度相同,仅供参考)。

    我使用的语法是:

    [DllImport("test.dll")]
    extern static public String test_method(String value);
    
    String returnedValue = test_method("hello world");
    

    编辑:

    2 回复  |  直到 14 年前
        1
  •  5
  •   Tim Lloyd    14 年前

    关于我的问题评论,我们已经确定这是一个附带了调试器的调试版本。这有一个 大量的

    我猜在发布版本和没有附加调试程序的情况下,性能差异现在更加合理了。

    如果您有一个非常健谈的API,并且被调用的本机方法很便宜,那么方法调用开销可能是一个性能问题。尝试设计一个不那么健谈的API。这是一种用于提高边界系统通信性能的典型技术。

    如果在对调试器问题进行排序之后,性能是可以接受的,那么有一种简单的技术,我可以通过添加单个属性轻松地在chattyapi中获得显著的性能提高。

    在具有导入函数(即DllImport函数)的类中,将 SuppressUnmanagedCodeSecurity 类的属性。这将从每个P/Invoke调用中删除一些昂贵的安全检查。请参阅上的文档

        2
  •  3
  •   Igor Zevaka    14 年前

    也许是字符串编组导致了减速。为了便于比较,尝试配置一个函数,该函数需要并返回基本C++类型。 int .

    在C++/CLI汇编中:

    System::String ^ test_method(System::String ^ args)
    {
        pin_ptr<const wchar_t> pp = PtrToStringChars(args);
        //This might leak, probably needs a smart pointer to wrap it
        wchar_t* ret = native_method(pp);
        return gcnew String^(ret);
    }