为什么在32位和64位操作系统使用一样的udp发包代码,速度差了将近1000 倍?

jojoxyz 2017-07-07 12:28:06
我使用delphi7+自带的indy9写了如下代码:

var
s:string;
i:integer;
begin
for i:=1 to 254 do
begin
s:=inttostr(i);
IdUDPClient1.Host:='11.111.11.'+s;
IdUDPClient1.Port :=3001;
IdUDPClient1.Active :=true;
IdUDPClient1.Send(s);
IdUDPClient1.Active :=false;
listbox1.item.add(s);
end;
end;

在xp下运行时间1.5秒,在WIN7 64位机器运行约700多秒。如果改为循环一次,也就是只发送一次,xp机器基本不要时间,但sever2008和WIN7 64位机器运行约3秒(兼容性设置了也没用)。这是为什么?
...全文
929 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
jojoxyz 2017-07-10
  • 打赏
  • 举报
回复
今天又测试了一下,取消两句active后,32位的xp和64位的win7运行效果一样,用xe8在win7编译后也一样。发现个新问题:如果在当前网段循环254次发包,用时约5秒,如果给其他网段发包循环254次用时不到1秒。这是什么原因呢?

Ps:本网段全网广播直接发包到.255即可。但我想通过对比测试知道时间差异的原因。
doloopcn 2017-07-09
  • 打赏
  • 举报
回复
这说明我们对控件相应的规则还没精通,多查查它的资料应该有收获
jojoxyz 2017-07-08
  • 打赏
  • 举报
回复
引用 2 楼 lyhoo163 的回复:
dephi的循环,编译时它有优化简化功能,对于无意义的重复循环,仅执行一次。 是否,此原因?
原代码的功能是全网段发送UDP数据,并非无意义的循环,不可能只执行一次。
jojoxyz 2017-07-08
  • 打赏
  • 举报
回复
引用 1 楼 doloopcn 的回复:
用Open和Close代替Active,试试
去掉原代码中的IdUDPClient1.Active :=true;和IdUDPClient1.Active :=false;两句,居然也可以正常发送UDP数据 然后在64位机器下运行速度明显提升(达到秒级),但与xp下运行速度相比仍有差距。
jjpweb 2017-07-08
  • 打赏
  • 举报
回复
坐等高手答案, 之前遇到过indy9的tcp连接超时设置在winxp下能用在win7下不起作用的问题,希望也能从中找到答案。
doloopcn 2017-07-07
  • 打赏
  • 举报
回复
用Open和Close代替Active,试试
lyhoo163 2017-07-07
  • 打赏
  • 举报
回复
dephi的循环,编译时它有优化简化功能,对于无意义的重复循环,仅执行一次。 是否,此原因?

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧