@@ -63,15 +63,64 @@ private IModbusFactory? ModbusFactory { get; set; }</Pre>
6363<p >对应 <code >IModbusClient</code > 实例方法如下</p >
6464
6565<ul class =" ul-demo" >
66- <li >线圈 (Coils) <code >ReadCoilsAsync</code > <code >WriteCoilAsync</code > <code >WriteMultipleCoilsAsync</code ></li >
67- <li >离散输入 (Discrete Inputs) <code >ReadInputsAsync</code ></li >
68- <li >输入寄存器 (Input Registers) <code >ReadInputRegistersAsync</code ></li >
69- <li >保持寄存器 (Holding Registers) <code >ReadHoldingRegistersAsync</code > <code >WriteRegisterAsync</code > <code >WriteMultipleRegistersAsync</code ></li >
66+ <li >线圈 (Coils) <code >ReadCoilsAsync</code > <code >WriteCoilAsync</code > <code >WriteMultipleCoilsAsync</code > 最大读取数量 < code >2000</ code > 最大写入数量 < code >1968</ code > </li >
67+ <li >离散输入 (Discrete Inputs) <code >ReadInputsAsync</code > 最大读取数量 < code >2000</ code > </li >
68+ <li >输入寄存器 (Input Registers) <code >ReadInputRegistersAsync</code > 最大读取数量 < code >125</ code > </li >
69+ <li >保持寄存器 (Holding Registers) <code >ReadHoldingRegistersAsync</code > <code >WriteRegisterAsync</code > <code >WriteMultipleRegistersAsync</code > 最大读取数量 < code >125</ code > 最大写入数量 < code >123</ code > </li >
7070</ul >
7171
72- <pre >Benchmark 结果如下:
73- | Method | Mean | Error | StdDev | Gen0 | Allocated |
74- |------------------ |--------:|--------:|--------:|----------:|----------:|
75- | LongbowModbus | 20.36 s | 0.404 s | 0.397 s | 1000.0000 | 15.81 MB |
76- | NModbus | 40.37 s | 0.806 s | 1.734 s | 2000.0000 | 29.6 MB |
77- </pre >
72+ <p >项目包含 Benchmark 基准测试工程</p >
73+
74+ <Pre >private const int NumberOfTask = 10;
75+ private const int TaskNumberOfClient = 10;
76+ private const int ClientCount = 10;
77+
78+ private async Task InitLongbowModbus()
79+ {
80+ var sc = new ServiceCollection ();
81+ sc .AddModbusFactory ();
82+
83+ var provider = sc .BuildServiceProvider ();
84+ var factory = provider .GetRequiredService & lt ;IModbusFactory > ; ();
85+
86+ for (var index = 0 ; index & lt ; ClientCount ; index ++ )
87+ {
88+ var client = factory .GetOrCreateTcpMaster ();
89+ await client .ConnectAsync (" 127.0.0.1" , 502 );
90+ await client .ReadHoldingRegistersAsync (0x 01 , 0x 00 , 100 );
91+
92+ _lgbModbusClients .Add (client );
93+ }
94+ }
95+
96+ [Benchmark]
97+ public async Task LongbowModbus()
98+ {
99+ var tasks = _lgbModbusClients .SelectMany (c =>
100+ {
101+ var tasks = new List & lt ;Task & gt ;();
102+ for (int i = 0 ; i & lt ; TaskNumberOfClient ; i ++ )
103+ {
104+ tasks .Add (Task .Run (async () = & gt ;
105+ {
106+ for (int i = 0 ; i & lt ; NumberOfTask ; i ++ )
107+ {
108+ var d = await c .ReadHoldingRegistersAsync (1 , 0 , 100 );
109+ }
110+ }));
111+ }
112+ return tasks ;
113+ }).ToList ();
114+
115+ await Task .WhenAll (tasks );
116+ } </Pre >
117+
118+ <p >共 10 个 <code >Socket</code > 连接,每个连接 10 个并发任务,每个任务进行 10 次 <code >ReadHoldingRegistersAsync</code > 方法调用,没个方法读取 100 个地址数据</p >
119+
120+ <p >Benchmark 结果如下:</p >
121+
122+ <Pre >| Method | Mean | Error | StdDev | Allocated |
123+ |------------------ |--------:|---------:|---------:|----------:|
124+ | LongbowModbus | 2.458 s | 0.0488 s | 0.1007 s | 2.11 MB |
125+ | NModbus | 4.752 s | 0.1544 s | 0.4552 s | 3.3 MB |
126+ </Pre >
0 commit comments