本人写了一个com服务程序,该程序有两个函数
ReadData([out] VARIANT *pBuf);//从一个文件读数据,传到前端
WriteData([in]VARIANT  *pBuf);//前端上传数据,利用com程序写到文件中
操作一个13M左右的文件,ReadData几秒钟就可以读出,传到前台;
而WriteData则需要两分钟左右。为什么速度会差这么多?有没有人遇到过。
本人发现WriteData函数大部分的时间都化在了把数据传输到com中了,ReadData也需要传递很多数据,但是它为什么那么快?高人们有何见解,望不吝赐教!谢谢!

解决方案 »

  1.   

    是可能需要自动列集和自动散集
    建议用IStream传数据,这样速度很快据估计不到一秒
      

  2.   

    我写得用IStream的程序大致如下
    WriteStreamFile1(IStream *pITransferStream, BSTR psFileName, BSTR psCheckStr, int piSize);
    但是利用IStream的几个函数(stat和read)做测试,发现IStream流不能够把数据传送过去,据说是要列集和散集,有人做过吗?去国外的论坛上看看了,发现传文件的都说用IStream传送,也看到了几个例子,但是没有看到完整的解决方案。是com的程序员太保守,不愿与人交流,还是com的设计太难了,没有有能够解决。困惑中......
      

  3.   

    ReadData([out] VARIANT *pBuf);//从一个文件读数据,传到前端
    WriteData([in]VARIANT  *pBuf);//前端上传数据,利用com程序写到文件中
    用指针来传递数组,要用一个参数来制定数组的大小,这样才能有效的进行参数的marshaling。
    ReadData([in] int cElems, [out]VARIANT *pBuf);
    WriteData([in] int cElems, [out]VARIANT *pBuf);
      

  4.   

    对此很感兴趣。
    但我试验了一个代码实现大约10兆左右的数据,通过VARIANT包装的SAFEARRAY来传递。
    没有向你所说的那么慢啊。
    记录了一下运行时间,不到1秒钟的时间就传递进去了呀,当然,不包括建立数据和具体接收数据的时间。我用的是COM+在本机完成的。
    有时间我再测试用DCOM的方式。
      

  5.   

    刚才测试了DCOM方式运行,效率确实不高
    12兆左右的数据,传递参数用了1分30秒左右。
    运行方式COM组件在一个计算机A中的COM+中注册
    在B计算机配置A生成的代理
    客户端在B计算机直接运行,通过代理连接A
    但考虑到网络速度,普通复制文件的方式,大概需要15~20秒左右。
    因此,跨计算机传递的时间还是要用到1分多钟。我没有测试你的ReadData方法,我估计应该差不多。
      

  6.   

    谢谢菜农同志。
    不信你试试,13M的数据写要1分钟左右,读只需要5秒钟左右。
    你的网络是百兆的吧!!
    如果读写都是1分钟,我无话可说,但是读只要几秒钟,这个如何解释?不信你试试。
    另外,你的程序没有出现服务器正在运行中这个消息框吗?我的程序重新用IMessageFilter处理过了才没有出现。
      

  7.   

    看了你在别的帖子里的发言,我估计你填充空间的方法对大数据量不合适
    对于大数据量,
    ::SafeArrayAccessData(psaDataID, (void**) &pDataID);
    for (int i = 0; i <= lUBound - lLBound; i++)
    {
    //现在你的可以对pDataID中的数据进行访问
    }
    ::SafeArrayUnaccessData(psa);的方法效率非常差。我实现的方法是用memcpy

    ::SafeArrayAccessData(psaDataID, (void**) &pDataID);
    memcpy(pData,pSrcData);
    ::SafeArrayUnaccessData(psa);
    你可试验看看?
      

  8.   

    好,我试验看看ReadData的实现
      

  9.   

    “不信你试试,13M的数据写要1分钟左右,读只需要5秒钟左右。”
    你所说的这个情况是com和客户端分别在不同的计算机上吗?
      

  10.   

    我的客户端和DCom服务器是在不同的机器上!!
    我的填充数据的方法我也注意到了,我也是高效的那种方法。我所指的时间不包括,数据填充的时间,仅仅指调用dcom函数的时间:
    如下:
    long it1=GetTickCout();
    dcominter1->WriteData(varBlob,psFileName,psCheckStr);
    long it2=GetTickCout()-it1;
    iT2时间为一分钟。为了测试是那里的时间损耗,我已经把Dcom里面WriteData函数置为空,没有一条语句。
      

  11.   

    我测试了ReadData,确实和WriteData有巨大的差异。msdn中有一片文章也许有帮助,我还没有时间深入学习,供参考
    Marshaling Your Data: Efficient Data Transfer Techniques Using COM and Windows 2000有结论了请通知我,我也非常关注这个问题。谢谢
      

  12.   

    为什么,传递一个数组到dcom中,dcom中读取它为空呢?
    [id(17), helpstring("method WriteByte")] HRESULT WriteByte( [in] long num, [in, size_is ( num )] BYTE *arr );
      

  13.   

    up
    重新说明:
    我的DCom程序是exe程序,在服务器和客户机上面都用 server.exe -regserver程序进行了注册.
    并且我写得代码都是从msdn上面,如何高效的传输数据上面看到的!不知道有何不妥!!我的程序可以运行连通,主要是服务端的函数里面检测到arr的内容不是我在客户端添入的内容,而是一些随机的内容!