KeyFansClub

首页 » - 特色讨论区 - » 键社茶餐厅 » 程序求测,对编程不感兴趣的就不用进了。
Prz - 2006/6/5 13:42:00
每天写几行的进度拖出来的...-v-
一个Delphi的基于WinSock2的多线程TCP Socket组件。

特点是:
1. Ring Buffer (环状缓冲)。从32字节到32M字节任意;
2. 操作简单。组件中有一个单独的线程为程序及时的处理Socket输入输出,包含了所有的异常处理,外部调用就如同文件读写一样简单;并且一个参数就可以选择是否为阻塞操作。
3. 能够实现Zero Copy (零复制)。从应用程序到系统网络堆栈中间没有任何冗余的内存复制操作,最大化传输效率。

接下来的目标就是扣接我的TriC加密组件,实现安全传输通道。

因为有计划今后走Open Source路线,所以现征求一些程序测试人员。

请有兴趣参与的人下载下面这个程序:
本程序对RingSocket的性能/稳定性进行测试:
通过本机Loopback接口在两个RingSocket之间传递1GB的数据;
每个RingSocket有读、写缓存各8MB.

使用方法:
0. 下载,解压,运行,点击Connect;

1. 等待7 - 45秒(视机器硬件配置);
* 如果1.5分钟以上仍然没有停止(CPU忙),或者CPU占用率降到很低,但是没有结果显示,请强行中止,并发帖告知;
* 如果出现任何错误提示,请发帖告知;

2. 请验证显示结果,Sending bytes 和 Receiving bytes的值必须一样,如果不一样,请发帖告知;

3. 如果通过验证,请发帖,包含以下内容:
  a. 显示结果的 Throughput 两行的值;
  b. 机器的CPU个数、型号、频率;
  c. 机器的内存大小、频率(是否是双通道也很重要);

* 下载 *


本程序对机器的总线和内存带宽很敏感,如果希望测试自己机器这方面性能的,也可以运行一下这个程序。

下面是最高和最低分记录: ^_^

最高分: 155MB/sec [AMD Athlon64 3000+, 1G DDR400x2, Bus 2.0GHz]
所有者: scegg

最低分: 28MB/sec [AMD Turion 64 MT-28 800MHz(PS), 512MB DDR333 (共享显存), Bus 200MHz]
所有者: 粘土火星


另外,可以作为参考的是:
2 * Intel Xeon 2.8GHz HT, 1G DDR 400, Bus 400MHz
得分是.... 75MB/sec
这就再次证明了程序对机器的总线和内存带宽的依赖程度... Prz
粘土火星 - 2006/6/5 13:53:00
* Recv Proc: (0) Receive Done: 1073741824
* Send Proc: (0) Send Done: 1073741824

Mobile AMD Turion 64 MT-28, 1600 MHz 1个(爆)
480M内存DDR333单通道……
Prz - 2006/6/5 14:00:00
er... Throughput 才是我需要的...
粘土火星 - 2006/6/5 14:15:00
Send那个是60.016M/s  Recv是59.852M/s
Prz - 2006/6/5 14:16:00
哦,好的,谢谢。
粘土火星 - 2006/6/5 14:19:00
顺带……改写一下最低记录吧…………

在下用省电模式=v=b  CPU 半速800Mhz运行结果是28M/s =v=b
LOVEHINA-AVC - 2006/6/5 14:20:00
试试不借助winsock2,直接跟驱动通信,据说这样效率还能再高一点
Prz - 2006/6/5 14:33:00
以下引用LOVEHINA-AVC在2006-6-5 14:20:43的发言:
试试不借助winsock2,直接跟驱动通信,据说这样效率还能再高一点


那就不是500行程序能够解决的了....况且有些特性(比如Overlapped IO)离了Winsock2的操作系统内部接口,实现起来非常麻烦....
LOVEHINA-AVC - 2006/6/5 14:37:00
你可以通过绑定完成端口来实现高效IO呀,这点并不需要winsock2
Prz - 2006/6/5 14:43:00
但是因为我的设计目标是对程序控制反应要和对Socket事件反应同样灵活,因此我采用了WaitForMultipleObjects方式,通过两方的Event来激活线程的响应。

不用WinSock2提供的功能,那就只有自己写驱动到事件的翻译过程了....


我觉得还是问题不能搞得太深入化,不用现成的钢筋混凝土模块的话...高楼大厦是盖不起来的...
LOVEHINA-AVC - 2006/6/5 22:43:00
跟我一样用的是WSAWaitForMultipleObjects啊...
当然,只有完成端口才是最高效的,如果你的程序并不需要同时开很多个socket,那么用winsock2接管的事件通知机制自然会方便省事得多,而且也不会令CPU占用率高出那么几个百分比

PS:只要你有足够的耐心和技巧,钢筋混凝土也是可以自己造的...在必要的情况下
mincomp - 2006/6/5 23:04:00
Send Proc: 53.674MB/sec
Recv Proc: 53.414MB/sec

Mobile AMD Sempron 2800+ 1600 MHz
448M内存 DDR333
cheong00 - 2006/6/5 23:10:00
Time Used: 12342ms, 12389ms
Throughput: 82.969MB/sec, 82645MB/sec

CPU: P4 3.0GE FSB(200MHz) x 1
Memory: 512MB DDR333 x 2 = 1GB (Dual Channel) (200MHz)
BUS: 800MHz
waistcoat - 2006/6/5 23:20:00
buffer size 8.0mb
sending bytes 1073741824                  receiving bytes 1073741824
time used 10312ms                        time used 10359ms
throughput 99.302mb/s                    throughput 98.851mb/s

p4 3.2Ghz 2Gram
Prz - 2006/6/5 23:35:00
看来Intel的平台带宽普遍偏低...果然还是AMD的CPU集成内存控制器比较王道...

等我的机器拿回来后再试一下Dothan平台的效果。(不过估计也好不到哪里去)
Prz - 2006/6/5 23:43:00
以下引用LOVEHINA-AVC在2006-6-5 22:43:53的发言:
跟我一样用的是WSAWaitForMultipleObjects啊...


其实我用的是WinAPI的WaitForMultipleObjects。
因为根据我耐心的对Google地毯式的搜索,发现WinSock2的Event其实和Windows的Event Object是同一个东西,只不过WSACreateEvent生成的Event是Manual Reset的。(这一点很多人不清楚,因为那些目标就是赚稿费的烂竽Windows网络编程书都没有介绍....XD)

所以我一般是用WinAPI生成好Events然后只用WSAEventSelect安装上去就行了。
LOVEHINA-AVC - 2006/6/6 1:51:00
其实不用GOOGLE的,自己反汇编一下就很清楚了

Exported Function() : WSACreateEvent - Ord:0022h
719E45F7 >/$  33C0          XOR EAX,EAX
719E45F9  |.  50            PUSH EAX                                ; /EventName => NULL
719E45FA  |.  50            PUSH EAX                                ; |InitiallySignaled => FALSE
719E45FB  |.  6A 01        PUSH 1                                  ; |ManualReset = TRUE
719E45FD  |.  50            PUSH EAX                                ; |pSecurity => NULL
719E45FE  |.  FF15 60119E71 CALL NEAR DWORD PTR DS:[<&KERNEL32.Creat>; \CreateEventA
719E4604  \.  C3            RETN

ws2_32.dll只是一个RING3的动态链接库,不太可能通过自己的方式生成内核事件对象,也没有必要避开kernel32的中转来调用系统服务
Prz - 2006/6/6 3:28:00
但是也有可能 WinSock 2将Kernel Event进行了包裹,捆绑了一些自己用的数据结构,那样就不能混用了啊...

当然反汇编可以看得出来,不过一般人不会这么干的 -_-|||
Prz - 2006/6/6 3:32:00
话又说回来,根据得到的数据,Intel平台上本机Loopback都达不到100MB/sec,那是不是意味着,就算有千兆网卡,也不可能有效的利用...这不就是欺诈消费者么?-_-||||
深海蓝空 - 2006/6/6 4:14:00
以下引用Prz在2006-6-6 3:32:32的发言:
话又说回来,根据得到的数据,Intel平台上本机Loopback都达不到100MB/sec,那是不是意味着,就算有千兆网卡,也不可能有效的利用...这不就是欺诈消费者么?-_-||||



time used 9855ms, 9886ms
throughput 103.907mb/s, 103.581mb/s

P4 3.20GHz
NVIDIA GeForce FX 5200
2G RAM
INTEL PRO/1000MT network connection
Prz - 2006/6/6 6:56:00
以下引用深海蓝空在2006-6-6 4:14:18的发言:

time used 9855ms, 9886ms
throughput 103.907mb/s, 103.581mb/s

P4 3.20GHz
NVIDIA GeForce FX 5200
2G RAM
INTEL PRO/1000MT network connection



RAM是DDR多少的?
还有内存总线带宽是多少? (不知道的话,就给芯片组型号吧)
深海蓝空 - 2006/6/6 7:42:00
以下引用Prz在2006-6-6 6:56:19的发言:


RAM是DDR多少的?
还有内存总线带宽是多少? (不知道的话,就给芯片组型号吧)


学校的电脑,系统信息看不出来是DDR多少,也不可能拆开机箱看...= =

导出了整个系统信息,MISHA自己看看需要参考什么数据吧...

CPU貌似是DOUBLE的...ORZ

[URL=upload/KFCFile9411_sys.txt]SYS.TXT[/URL]
Rinrin - 2006/6/6 8:58:00
似乎和系统相关
在普通的Windows Server 2003 R2下测试为6xMB/s
在一个最小化的(支持网络)Windows XP Embedded下测试为8xMB/s
Rinrin - 2006/6/6 9:16:00
以下引用Prz在2006-6-6 3:32:32的发言:
话又说回来,根据得到的数据,Intel平台上本机Loopback都达不到100MB/sec,那是不是意味着,就算有千兆网卡,也不可能有效的利用...这不就是欺诈消费者么?-_-||||

一般来说
网卡连接在PCI总线上
根据资料
PCI的峰值带宽才132MB/s
千兆网卡确实有些问题....
粘土火星 - 2006/6/6 9:18:00
集成的千兆走的不是PCI-E么= =

当然别是PCI-E 1x就好= =b
忧郁の丸子 - 2006/6/6 9:32:00
76MB/sec [CD 2.66G, Intel 915G,  DDR400 256x2, FSB 533MHz]

影响内存性能的不仅是带宽,主板芯片的性能也是很重要的因素,所以给出了主板芯片型号

--------------------------------
关于千兆网卡。。。现在偶用的还是512Kb的带宽。。。

就算是Rossi,开辆小电驴,速度还是上不去。。。
Prz - 2006/6/7 11:03:00
Dothan 平台结果出来了...

92.86MB/sec
[Pentium M 2.0G, DDR2-4200 (533MHz) 1G (不知道是不是双通道模式), FSB 533MHz]
忧郁の丸子 - 2006/6/7 13:35:00
Pentium M就是强啊,Pentium M才是高效的PIII的延续
粘土火星 - 2006/6/7 13:36:00
那扣肉是什么?
Prz - 2006/6/7 15:06:00
纠正一下,刚才在重新灌的,打过所有补丁,刚装完驱动的非常干净的系统上测试:

100.1MB/sec
[Pentium M 2.0G, DDR2-4200 (533MHz) 1G (不知道是不是双通道模式), FSB 533MHz]
12
查看完整版本: 程序求测,对编程不感兴趣的就不用进了。