DCom高手来看看,有关com服务程序[in],[out]两种参数的传递的效率问题!

romijn 2003-03-06 02:39:39
本人写了一个com服务程序,该程序有两个函数
ReadData([out] VARIANT *pBuf);//从一个文件读数据,传到前端
WriteData([in]VARIANT *pBuf);//前端上传数据,利用com程序写到文件中
操作一个13M左右的文件,ReadData几秒钟就可以读出,传到前台;
而WriteData则需要两分钟左右。为什么速度会差这么多?有没有人遇到过。
本人发现WriteData函数大部分的时间都化在了把数据传输到com中了,ReadData也需要传递很多数据,但是它为什么那么快?高人们有何见解,望不吝赐教!谢谢!
...全文
49 点赞 收藏 17
写回复
17 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
romijn 2003-03-17
up
重新说明:
我的DCom程序是exe程序,在服务器和客户机上面都用 server.exe -regserver程序进行了注册.
并且我写得代码都是从msdn上面,如何高效的传输数据上面看到的!不知道有何不妥!!我的程序可以运行连通,主要是服务端的函数里面检测到arr的内容不是我在客户端添入的内容,而是一些随机的内容!
回复
romijn 2003-03-14
为什么,传递一个数组到dcom中,dcom中读取它为空呢?
[id(17), helpstring("method WriteByte")] HRESULT WriteByte( [in] long num, [in, size_is ( num )] BYTE *arr );
回复
zzyx 2003-03-13
我测试了ReadData,确实和WriteData有巨大的差异。

msdn中有一片文章也许有帮助,我还没有时间深入学习,供参考
Marshaling Your Data: Efficient Data Transfer Techniques Using COM and Windows 2000

有结论了请通知我,我也非常关注这个问题。谢谢
回复
yongdu 2003-03-13
关注
回复
romijn 2003-03-13
好的!!!我正在找解决问题的方法!
回复
romijn 2003-03-12
我的客户端和DCom服务器是在不同的机器上!!
我的填充数据的方法我也注意到了,我也是高效的那种方法。我所指的时间不包括,数据填充的时间,仅仅指调用dcom函数的时间:
如下:
long it1=GetTickCout();
dcominter1->WriteData(varBlob,psFileName,psCheckStr);
long it2=GetTickCout()-it1;
iT2时间为一分钟。为了测试是那里的时间损耗,我已经把Dcom里面WriteData函数置为空,没有一条语句。
回复
zzyx 2003-03-11
“不信你试试,13M的数据写要1分钟左右,读只需要5秒钟左右。”
你所说的这个情况是com和客户端分别在不同的计算机上吗?
回复
zzyx 2003-03-11
好,我试验看看ReadData的实现
回复
zzyx 2003-03-11
看了你在别的帖子里的发言,我估计你填充空间的方法对大数据量不合适
对于大数据量,
::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);
你可试验看看?
回复
romijn 2003-03-11
谢谢菜农同志。
不信你试试,13M的数据写要1分钟左右,读只需要5秒钟左右。
你的网络是百兆的吧!!
如果读写都是1分钟,我无话可说,但是读只要几秒钟,这个如何解释?不信你试试。
另外,你的程序没有出现服务器正在运行中这个消息框吗?我的程序重新用IMessageFilter处理过了才没有出现。
回复
zzyx 2003-03-11
刚才测试了DCOM方式运行,效率确实不高
12兆左右的数据,传递参数用了1分30秒左右。
运行方式

COM组件在一个计算机A中的COM+中注册
在B计算机配置A生成的代理
客户端在B计算机直接运行,通过代理连接A
但考虑到网络速度,普通复制文件的方式,大概需要15~20秒左右。
因此,跨计算机传递的时间还是要用到1分多钟。

我没有测试你的ReadData方法,我估计应该差不多。
回复
zzyx 2003-03-11
对此很感兴趣。
但我试验了一个代码实现大约10兆左右的数据,通过VARIANT包装的SAFEARRAY来传递。
没有向你所说的那么慢啊。
记录了一下运行时间,不到1秒钟的时间就传递进去了呀,当然,不包括建立数据和具体接收数据的时间。

我用的是COM+在本机完成的。
有时间我再测试用DCOM的方式。
回复
ruihuahan 2003-03-10
ReadData([out] VARIANT *pBuf);//从一个文件读数据,传到前端
WriteData([in]VARIANT *pBuf);//前端上传数据,利用com程序写到文件中
用指针来传递数组,要用一个参数来制定数组的大小,这样才能有效的进行参数的marshaling。
ReadData([in] int cElems, [out]VARIANT *pBuf);
WriteData([in] int cElems, [out]VARIANT *pBuf);
回复
romijn 2003-03-10
我写得用IStream的程序大致如下
WriteStreamFile1(IStream *pITransferStream, BSTR psFileName, BSTR psCheckStr, int piSize);
但是利用IStream的几个函数(stat和read)做测试,发现IStream流不能够把数据传送过去,据说是要列集和散集,有人做过吗?去国外的论坛上看看了,发现传文件的都说用IStream传送,也看到了几个例子,但是没有看到完整的解决方案。是com的程序员太保守,不愿与人交流,还是com的设计太难了,没有有能够解决。困惑中......
回复
romijn 2003-03-07
谢谢,能否给出例子来!!小弟不胜感激!
回复
lanhuaiyu 2003-03-06
是可能需要自动列集和自动散集
建议用IStream传数据,这样速度很快据估计不到一秒
回复
romijn 2003-03-06
这个问题没有人知道吗?可以多多给分!1K怎么样
回复
相关推荐
发帖
ATL
创建于2007-09-28

3214

社区成员

ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
申请成为版主
帖子事件
创建了帖子
2003-03-06 02:39
社区公告
暂无公告