项目用到了一些opencv的函数,所以使用非托管C++做的算法,再使用托管C++封装,x86下运行正常。用64位的opencv库,将程序移植到x64下后,性能分析clr.dll独占样本居然达到了70%。而且显示调用clr.dll的函数都是托管C++封装函数。而且C#下实例化大数组的时候,也大量调用了clr.dll。但在x86下时,相同的程序,clr.dll一共才百分之零点几。这是为什么那?x64下配置需要注意什么那?

解决方案 »

  1.   

    clr.dll应该是负责垃圾回收,为什么x64下,垃圾回收会这么耗资源?
      

  2.   

    托管C++与调用非托管C++的函数,我的写法如下:
    //托管C++函数
    int Cal_ManagedFun(array <unsigned char>^src,array <unsigned char>^dst)
    {
    //新建一个托管指针并开辟空间
    IntPtr srcPtr = Marshal::AllocHGlobal(Marshal::SizeOf(src[0])*src.Length);
            IntPtr dstPtr = Marshal::AllocHGlobal(Marshal::SizeOf(dst[0])*dst.Length); //托管数组拷贝至托管指针
    Marshal::Copy( src, 0, srcPtr, src.Length );

    //托管指针转非托管指针,并写入算法参数
    int b = m_Impl->Cal_UnmanagedFun((unsigned char *)srcPtr.ToPointer(),(unsigned char *)dstPtr.ToPointer());        //托管指针拷贝至托管数组
    Marshal::Copy(dstPtr, dst, 0, dst.Length); //释放指针
    Marshal::FreeHGlobal(srcPtr);
    return b;
    }