IOCP时给接收分配的内存是否4K是效率最高的

ZyxIp 2013-05-20 07:29:35
IOCP时,投递的接收内存块TWSABUF分配多大是效率最高的,听说系统内存是以4K进行分页的,
就算是分配100字节,系统也是锁定4K。

是否可以说那就分配4K是效率最好的。

TIOCPUDPHandleData = packed record
Overlapped: OVERLAPPED;
wsaBuffer: TWSABUF;
其它参数

end;
是让TIOCPUDPHandleData 整体达到4K还是只是wsaBuffer.Buf为4K就好了。
...全文
335 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2013-05-27
  • 打赏
  • 举报
回复
在实际环境测量方可知。
ygnet 2013-05-26
  • 打赏
  • 举报
回复
wsaBuffer.Buf 我估计,cpu不会对此数据做太多的运算, 基本就是一个内存copy动作,所以,在不在cpu的cache里,差距不大 wsaBuffer.Buf的长度,在不同应用场景下,影响挺大的 wsaBuffer.Buf会被锁定在内核中 如果连接过多,要考察被内核锁定太多内存是不是会影响性能
虎子8 2013-05-21
  • 打赏
  • 举报
回复
只是wsaBuffer.Buf为4K就好 TIOCPUDPHandleData = packed record 这里就不要写packed
xhz8000 2013-05-21
  • 打赏
  • 举报
回复
这个问题没有正真测试过!但是我的包结构就是尽量按4k的倍数建立起来的!
ZyxIp 2013-05-20
  • 打赏
  • 举报
回复
IOCP UDP 协议时,WSASendTo投递的速度能有多少,应该控制到多少? 如果太快的话系统应该发不出去了吧。
ZyxIp 2013-05-20
  • 打赏
  • 举报
回复
我测试就是放在一个按钮下进行的。 procedure TForm1.Button5Click(Sender: TObject); begin 2楼的代码 end; 只是想确定频繁的内存分配 和 使用事先分配好内存,使用临界区锁定的方式那个效率更高
蓝色光芒 2013-05-20
  • 打赏
  • 举报
回复
作为应用来讲,wsaBuffer: TWSABUF;的大小,经济又相对效率高的做法是用应用中最频繁的数据包的大小,相对$10收整. 如果要追求极致,还应该考虑CPU的1,2级缓存大小 你那样测试,是否用了多线程测试? 建议搜索内存池相关文章.
sololie 2013-05-20
  • 打赏
  • 举报
回复
ZyxIp 2013-05-20
  • 打赏
  • 举报
回复
var
  a:TRTLCS;
  i:integer;
  p:Pointer;
  Len:Integer;
  t1,t2,t3,t4:LongWord;
  P1,P2:Integer;
begin
  Len:=999999;
//分配Len次内存和进行Len次临界区那个速度快
  t1:=GetTickCount;
  for i:=0 to Len do
  begin
    p:=GetMemory(1024*4);
    FreeMemory(p);
  end;
  t2:=GetTickCount;
  a:=TRTLCS.Create;
  t3:=GetTickCount;
  for i:=0 to Len do
  begin
    a.Lock;
    P1:=i;
    P2:=P1;
    a.Unlock;
  end;
  t4:=GetTickCount;
  t2:=t2-t1;
  t4:=t4-t3;
  Showmessage(Format('%d %d',[t2,t4]));
end;
测试了一下,4633 62 还是进临界区速度快,还快好多。看来得先分配好内存,然后直接使用效率最高。
ZyxIp 2013-05-20
  • 打赏
  • 举报
回复
TWSABUF的内存分配占用的时候多还是我先分配好N个用链表,然后用临界区来给线程返回TWSABUF速度快。 内存分配所占用的CPU时间和临界区所切换所占用的CPU时间那个更费时。

1,593

社区成员

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

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