Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
dotNET Platform
MQTTnet
提交
01a5aeeb
MQTTnet
项目概览
dotNET Platform
/
MQTTnet
10 个月 前同步成功
通知
0
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
MQTTnet
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
未验证
提交
01a5aeeb
编写于
11月 30, 2022
作者:
C
Christian
提交者:
GitHub
11月 30, 2022
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Refactor benchmarks (#1601)
上级
47df131e
变更
21
隐藏空白更改
内联
并排
Showing
21 changed file
with
210 addition
and
253 deletion
+210
-253
Source/MQTTnet.Benchmarks/BaseBenchmark.cs
Source/MQTTnet.Benchmarks/BaseBenchmark.cs
+4
-0
Source/MQTTnet.Benchmarks/ChannelAdapterBenchmark.cs
Source/MQTTnet.Benchmarks/ChannelAdapterBenchmark.cs
+33
-34
Source/MQTTnet.Benchmarks/Configurations/AllowNonOptimized.cs
...ce/MQTTnet.Benchmarks/Configurations/AllowNonOptimized.cs
+0
-22
Source/MQTTnet.Benchmarks/Configurations/BaseConfig.cs
Source/MQTTnet.Benchmarks/Configurations/BaseConfig.cs
+0
-19
Source/MQTTnet.Benchmarks/Configurations/RuntimeCompareConfig.cs
...MQTTnet.Benchmarks/Configurations/RuntimeCompareConfig.cs
+0
-19
Source/MQTTnet.Benchmarks/LoggerBenchmark.cs
Source/MQTTnet.Benchmarks/LoggerBenchmark.cs
+1
-1
Source/MQTTnet.Benchmarks/MQTTnet.Benchmarks.csproj
Source/MQTTnet.Benchmarks/MQTTnet.Benchmarks.csproj
+1
-1
Source/MQTTnet.Benchmarks/MessageDeliveryBenchmark.cs
Source/MQTTnet.Benchmarks/MessageDeliveryBenchmark.cs
+5
-6
Source/MQTTnet.Benchmarks/MessageProcessingBenchmark.cs
Source/MQTTnet.Benchmarks/MessageProcessingBenchmark.cs
+1
-1
Source/MQTTnet.Benchmarks/MessageProcessingMqttConnectionContextBenchmark.cs
...hmarks/MessageProcessingMqttConnectionContextBenchmark.cs
+1
-1
Source/MQTTnet.Benchmarks/MqttPacketReaderWriterBenchmark.cs
Source/MQTTnet.Benchmarks/MqttPacketReaderWriterBenchmark.cs
+5
-2
Source/MQTTnet.Benchmarks/MqttTcpChannelBenchmark.cs
Source/MQTTnet.Benchmarks/MqttTcpChannelBenchmark.cs
+1
-1
Source/MQTTnet.Benchmarks/Program.cs
Source/MQTTnet.Benchmarks/Program.cs
+122
-71
Source/MQTTnet.Benchmarks/RoundtripProcessingBenchmark.cs
Source/MQTTnet.Benchmarks/RoundtripProcessingBenchmark.cs
+1
-1
Source/MQTTnet.Benchmarks/ServerProcessingBenchmark.cs
Source/MQTTnet.Benchmarks/ServerProcessingBenchmark.cs
+5
-1
Source/MQTTnet.Benchmarks/SubscribeBenchmark.cs
Source/MQTTnet.Benchmarks/SubscribeBenchmark.cs
+5
-1
Source/MQTTnet.Benchmarks/TcpPipesBenchmark.cs
Source/MQTTnet.Benchmarks/TcpPipesBenchmark.cs
+1
-1
Source/MQTTnet.Benchmarks/TopicFilterComparerBenchmark.cs
Source/MQTTnet.Benchmarks/TopicFilterComparerBenchmark.cs
+1
-1
Source/MQTTnet.Benchmarks/TopicGenerator.cs
Source/MQTTnet.Benchmarks/TopicGenerator.cs
+18
-15
Source/MQTTnet.Benchmarks/UnsubscribeBenchmark.cs
Source/MQTTnet.Benchmarks/UnsubscribeBenchmark.cs
+5
-1
Source/MQTTnet.Benchmarks/packages.config
Source/MQTTnet.Benchmarks/packages.config
+0
-54
未找到文件。
Source/MQTTnet.Benchmarks/BaseBenchmark.cs
浏览文件 @
01a5aeeb
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
namespace
MQTTnet.Benchmarks
{
public
abstract
class
BaseBenchmark
...
...
Source/MQTTnet.Benchmarks/ChannelAdapterBenchmark.cs
浏览文件 @
01a5aeeb
...
...
@@ -2,79 +2,78 @@
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using
BenchmarkDotNet.Attributes
;
using
MQTTnet.Adapter
;
using
MQTTnet.Internal
;
using
MQTTnet.Packets
;
using
System
;
using
System.IO
;
using
System.Threading
;
using
BenchmarkDotNet.Attributes
;
using
MQTTnet.Adapter
;
using
MQTTnet.Diagnostics
;
using
MQTTnet.Formatter
;
using
MQTTnet.Packets
;
using
MQTTnet.Tests.Mockups
;
namespace
MQTTnet.Benchmarks
{
[
MemoryDiagnoser
]
public
sealed
class
ChannelAdapterBenchmark
public
sealed
class
ChannelAdapterBenchmark
:
BaseBenchmark
{
MqttChannelAdapter
_channelAdapter
;
int
_iterations
;
MemoryStream
_stream
;
MqttPublishPacket
_packet
;
MemoryStream
_stream
;
[
GlobalSetup
]
public
void
Setup
()
[
Benchmark
]
public
void
Receive_10000_Messages
()
{
_packet
=
new
MqttPublishPacket
{
Topic
=
"A"
};
var
serializer
=
new
MqttPacketFormatterAdapter
(
MqttProtocolVersion
.
V311
,
new
MqttBufferWriter
(
4096
,
65535
));
var
serializedPacket
=
Join
(
serializer
.
Encode
(
_packet
).
Join
());
_iterations
=
10000
;
_stream
=
new
MemoryStream
(
_iterations
*
serializedPacket
.
Length
);
_stream
.
Position
=
0
;
for
(
var
i
=
0
;
i
<
_iterations
;
i
++)
for
(
var
i
=
0
;
i
<
10000
;
i
++)
{
_
stream
.
Write
(
serializedPacket
,
0
,
serializedPacket
.
Length
);
_
channelAdapter
.
ReceivePacketAsync
(
CancellationToken
.
None
).
GetAwaiter
().
GetResult
(
);
}
_stream
.
Position
=
0
;
var
channel
=
new
MemoryMqttChannel
(
_stream
);
_channelAdapter
=
new
MqttChannelAdapter
(
channel
,
serializer
,
null
,
new
MqttNetEventLogger
());
}
[
Benchmark
]
public
void
Receive
_10000_Messages
()
public
void
Send
_10000_Messages
()
{
_stream
.
Position
=
0
;
for
(
var
i
=
0
;
i
<
10000
;
i
++)
{
_channelAdapter
.
ReceivePacketAsync
(
CancellationToken
.
None
).
GetAwaiter
().
GetResult
();
_channelAdapter
.
SendPacketAsync
(
_packet
,
CancellationToken
.
None
).
GetAwaiter
().
GetResult
();
}
_stream
.
Position
=
0
;
}
[
Benchmark
]
public
void
Se
nd_10000_Messages
()
[
GlobalSetup
]
public
void
Se
tup
()
{
_stream
.
Position
=
0
;
_packet
=
new
MqttPublishPacket
{
Topic
=
"A"
};
for
(
var
i
=
0
;
i
<
10000
;
i
++)
var
serializer
=
new
MqttPacketFormatterAdapter
(
MqttProtocolVersion
.
V311
,
new
MqttBufferWriter
(
4096
,
65535
));
var
serializedPacket
=
Join
(
serializer
.
Encode
(
_packet
).
Join
());
_iterations
=
10000
;
_stream
=
new
MemoryStream
(
_iterations
*
serializedPacket
.
Length
);
for
(
var
i
=
0
;
i
<
_iterations
;
i
++)
{
_
channelAdapter
.
SendPacketAsync
(
_packet
,
CancellationToken
.
None
).
GetAwaiter
().
GetResult
(
);
_
stream
.
Write
(
serializedPacket
,
0
,
serializedPacket
.
Length
);
}
_stream
.
Position
=
0
;
var
channel
=
new
MemoryMqttChannel
(
_stream
);
_channelAdapter
=
new
MqttChannelAdapter
(
channel
,
serializer
,
null
,
new
MqttNetEventLogger
());
}
static
byte
[]
Join
(
params
ArraySegment
<
byte
>[]
chunks
)
...
...
@@ -88,4 +87,4 @@ namespace MQTTnet.Benchmarks
return
buffer
.
ToArray
();
}
}
}
}
\ No newline at end of file
Source/MQTTnet.Benchmarks/Configurations/AllowNonOptimized.cs
已删除
100644 → 0
浏览文件 @
47df131e
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using
BenchmarkDotNet.Jobs
;
using
BenchmarkDotNet.Validators
;
namespace
MQTTnet.Benchmarks.Configurations
{
/// <summary>
/// this options may be used to run benchmarks in debugmode and attach a performance profiler
/// https://benchmarkdotnet.org/Configs/Configs.htm
/// </summary>
public
class
AllowNonOptimized
:
BaseConfig
{
public
AllowNonOptimized
()
{
AddValidator
(
JitOptimizationsValidator
.
DontFailOnError
);
// ALLOW NON-OPTIMIZED DLLS
AddJob
(
Job
.
InProcess
);
}
}
}
\ No newline at end of file
Source/MQTTnet.Benchmarks/Configurations/BaseConfig.cs
已删除
100644 → 0
浏览文件 @
47df131e
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using
BenchmarkDotNet.Configs
;
using
System.Linq
;
namespace
MQTTnet.Benchmarks.Configurations
{
public
class
BaseConfig
:
ManualConfig
{
public
BaseConfig
()
{
AddLogger
(
DefaultConfig
.
Instance
.
GetLoggers
().
ToArray
());
// manual config has no loggers by default
AddExporter
(
DefaultConfig
.
Instance
.
GetExporters
().
ToArray
());
// manual config has no exporters by default
AddColumnProvider
(
DefaultConfig
.
Instance
.
GetColumnProviders
().
ToArray
());
// manual config has no columns by default
}
}
}
Source/MQTTnet.Benchmarks/Configurations/RuntimeCompareConfig.cs
已删除
100644 → 0
浏览文件 @
47df131e
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using
BenchmarkDotNet.Environments
;
using
BenchmarkDotNet.Jobs
;
using
BenchmarkDotNet.Toolchains.CsProj
;
namespace
MQTTnet.Benchmarks.Configurations
{
public
class
RuntimeCompareConfig
:
BaseConfig
{
public
RuntimeCompareConfig
()
{
AddJob
(
Job
.
Default
.
WithRuntime
(
ClrRuntime
.
Net48
));
AddJob
(
Job
.
Default
.
WithRuntime
(
CoreRuntime
.
Core50
).
WithToolchain
(
CsProjCoreToolchain
.
NetCoreApp50
));
}
}
}
Source/MQTTnet.Benchmarks/LoggerBenchmark.cs
浏览文件 @
01a5aeeb
...
...
@@ -11,7 +11,7 @@ namespace MQTTnet.Benchmarks
[
SimpleJob
(
RuntimeMoniker
.
Net60
)]
[
RPlotExporter
]
[
MemoryDiagnoser
]
public
class
LoggerBenchmark
public
class
LoggerBenchmark
:
BaseBenchmark
{
MqttNetNullLogger
_nullLogger
;
MqttNetSourceLogger
_sourceNullLogger
;
...
...
Source/MQTTnet.Benchmarks/MQTTnet.Benchmarks.csproj
浏览文件 @
01a5aeeb
...
...
@@ -3,7 +3,7 @@
<PropertyGroup>
<OutputType>Exe</OutputType>
<DebugType>Full</DebugType>
<TargetFrameworks>net
5.0;net
6.0</TargetFrameworks>
<TargetFrameworks>net6.0</TargetFrameworks>
<LangVersion>7.2</LangVersion>
<IsPackable>false</IsPackable>
<EnableNETAnalyzers>false</EnableNETAnalyzers>
...
...
Source/MQTTnet.Benchmarks/MessageDeliveryBenchmark.cs
浏览文件 @
01a5aeeb
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using
BenchmarkDotNet.Attributes
;
using
BenchmarkDotNet.Jobs
;
using
MQTTnet.Client
;
using
MQTTnet.Server
;
using
System
;
...
...
@@ -8,14 +11,10 @@ using System.Linq;
using
System.Threading
;
using
System.Threading.Tasks
;
namespace
MQTTnet.Benchmarks
{
/// <summary>
/// Create a number of topics, publish, subscribe, and wait for response
/// </summary>
[
MemoryDiagnoser
]
public
class
MessageDeliveryBenchmark
public
class
MessageDeliveryBenchmark
:
BaseBenchmark
{
List
<
MqttApplicationMessage
>
_topicPublishMessages
;
...
...
Source/MQTTnet.Benchmarks/MessageProcessingBenchmark.cs
浏览文件 @
01a5aeeb
...
...
@@ -12,7 +12,7 @@ namespace MQTTnet.Benchmarks
[
SimpleJob
(
RuntimeMoniker
.
Net60
)]
[
RPlotExporter
,
RankColumn
]
[
MemoryDiagnoser
]
public
class
MessageProcessingBenchmark
public
class
MessageProcessingBenchmark
:
BaseBenchmark
{
MqttServer
_mqttServer
;
IMqttClient
_mqttClient
;
...
...
Source/MQTTnet.Benchmarks/MessageProcessingMqttConnectionContextBenchmark.cs
浏览文件 @
01a5aeeb
...
...
@@ -15,7 +15,7 @@ namespace MQTTnet.Benchmarks
{
[
SimpleJob
(
RuntimeMoniker
.
Net60
)]
[
MemoryDiagnoser
]
public
class
MessageProcessingMqttConnectionContextBenchmark
public
class
MessageProcessingMqttConnectionContextBenchmark
:
BaseBenchmark
{
IWebHost
_host
;
IMqttClient
_mqttClient
;
...
...
Source/MQTTnet.Benchmarks/MqttPacketReaderWriterBenchmark.cs
浏览文件 @
01a5aeeb
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using
System
;
using
BenchmarkDotNet.Attributes
;
using
BenchmarkDotNet.Jobs
;
using
MQTTnet.AspNetCore
;
using
MQTTnet.Formatter
;
using
MQTTnet.Tests.Mockups
;
...
...
@@ -9,7 +12,7 @@ namespace MQTTnet.Benchmarks
{
[
SimpleJob
(
RuntimeMoniker
.
Net60
)]
[
MemoryDiagnoser
]
public
class
MqttPacketReaderWriterBenchmark
public
class
MqttPacketReaderWriterBenchmark
:
BaseBenchmark
{
readonly
byte
[]
_demoPayload
=
new
byte
[
1024
];
...
...
Source/MQTTnet.Benchmarks/MqttTcpChannelBenchmark.cs
浏览文件 @
01a5aeeb
...
...
@@ -17,7 +17,7 @@ namespace MQTTnet.Benchmarks
{
[
SimpleJob
(
RuntimeMoniker
.
Net60
)]
[
MemoryDiagnoser
]
public
sealed
class
MqttTcpChannel
Benchmark
public
class
MqttTcpChannelBenchmark
:
Base
Benchmark
{
MqttServer
_mqttServer
;
IMqttChannel
_serverChannel
;
...
...
Source/MQTTnet.Benchmarks/Program.cs
浏览文件 @
01a5aeeb
...
...
@@ -3,89 +3,140 @@
// See the LICENSE file in the project root for more information.
using
System
;
using
System.Collections.Generic
;
using
System.Linq
;
using
BenchmarkDotNet.Loggers
;
using
BenchmarkDotNet.Running
;
using
MQTTnet.Benchmarks.Configurations
;
using
MQTTnet.Diagnostics
;
namespace
MQTTnet.Benchmarks
{
public
static
class
Program
{
public
static
void
Main
(
string
[]
args
)
static
int
_selectedBenchmarkIndex
;
static
List
<
Type
>
_benchmarks
;
public
static
void
Main
(
string
[]
arguments
)
{
Console
.
WriteLine
(
$"MQTTnet - Benchmarks (
{
TargetFrameworkProvider
.
TargetFramework
}
)"
);
Console
.
WriteLine
(
"--------------------------------------------------------"
);
Console
.
WriteLine
(
"1 = MessageProcessingBenchmark"
);
Console
.
WriteLine
(
"2 = SerializerBenchmark"
);
Console
.
WriteLine
(
"3 = LoggerBenchmark"
);
Console
.
WriteLine
(
"4 = TopicFilterComparerBenchmark"
);
Console
.
WriteLine
(
"5 = ChannelAdapterBenchmark"
);
Console
.
WriteLine
(
"6 = MqttTcpChannelBenchmark"
);
Console
.
WriteLine
(
"7 = TcpPipesBenchmark"
);
Console
.
WriteLine
(
"8 = MessageProcessingMqttConnectionContextBenchmark"
);
Console
.
WriteLine
(
"9 = ServerProcessingBenchmark"
);
Console
.
WriteLine
(
"a = MqttPacketReaderWriterBenchmark"
);
Console
.
WriteLine
(
"b = RoundtripBenchmark"
);
Console
.
WriteLine
(
"c = SubscribeBenchmark"
);
Console
.
WriteLine
(
"d = UnsubscribeBenchmark"
);
Console
.
WriteLine
(
"e = MessageDeliveryBenchmark"
);
Console
.
WriteLine
(
"f = AsyncLockBenchmark"
);
Console
.
WriteLine
(
"g = MqttBufferReaderBenchmark"
);
var
pressedKey
=
Console
.
ReadKey
(
true
);
switch
(
pressedKey
.
KeyChar
)
_benchmarks
=
CollectBenchmarks
();
HandleArguments
(
arguments
);
while
(
true
)
{
case
'1'
:
BenchmarkRunner
.
Run
<
MessageProcessingBenchmark
>();
break
;
case
'2'
:
BenchmarkRunner
.
Run
<
SerializerBenchmark
>();
break
;
case
'3'
:
BenchmarkRunner
.
Run
<
LoggerBenchmark
>();
break
;
case
'4'
:
BenchmarkRunner
.
Run
<
TopicFilterComparerBenchmark
>();
break
;
case
'5'
:
BenchmarkRunner
.
Run
<
ChannelAdapterBenchmark
>();
break
;
case
'6'
:
BenchmarkRunner
.
Run
<
MqttTcpChannelBenchmark
>();
break
;
case
'7'
:
BenchmarkRunner
.
Run
<
TcpPipesBenchmark
>();
break
;
case
'8'
:
BenchmarkRunner
.
Run
<
MessageProcessingMqttConnectionContextBenchmark
>(
new
RuntimeCompareConfig
());
break
;
case
'9'
:
BenchmarkRunner
.
Run
<
ServerProcessingBenchmark
>();
break
;
case
'a'
:
BenchmarkRunner
.
Run
(
typeof
(
MqttPacketReaderWriterBenchmark
));
break
;
case
'b'
:
BenchmarkRunner
.
Run
<
RoundtripProcessingBenchmark
>();
break
;
case
'c'
:
BenchmarkRunner
.
Run
<
SubscribeBenchmark
>();
break
;
case
'd'
:
BenchmarkRunner
.
Run
<
UnsubscribeBenchmark
>();
break
;
case
'e'
:
BenchmarkRunner
.
Run
<
MessageDeliveryBenchmark
>();
break
;
case
'f'
:
BenchmarkRunner
.
Run
<
AsyncLockBenchmark
>();
break
;
case
'g'
:
BenchmarkRunner
.
Run
<
MqttBufferReaderBenchmark
>();
break
;
RenderMenu
();
var
key
=
Console
.
ReadKey
(
true
);
if
(
key
.
Key
==
ConsoleKey
.
DownArrow
)
{
_selectedBenchmarkIndex
++;
if
(
_selectedBenchmarkIndex
>
_benchmarks
.
Count
-
1
)
{
_selectedBenchmarkIndex
=
0
;
}
}
else
if
(
key
.
Key
==
ConsoleKey
.
UpArrow
)
{
_selectedBenchmarkIndex
--;
if
(
_selectedBenchmarkIndex
<
0
)
{
_selectedBenchmarkIndex
=
_benchmarks
.
Count
-
1
;
}
}
else
if
(
key
.
Key
==
ConsoleKey
.
Escape
)
{
Environment
.
Exit
(
0
);
}
else
if
(
key
.
Key
==
ConsoleKey
.
Enter
)
{
break
;
}
}
BenchmarkRunner
.
Run
(
_benchmarks
[
_selectedBenchmarkIndex
]);
Console
.
ForegroundColor
=
ConsoleColor
.
Yellow
;
Console
.
WriteLine
(
"Press any key to exit"
);
Console
.
ReadLine
();
}
static
List
<
Type
>
CollectBenchmarks
()
{
var
benchmarks
=
new
List
<
Type
>();
var
types
=
typeof
(
Program
).
Assembly
.
GetExportedTypes
();
foreach
(
var
type
in
types
)
{
if
(
typeof
(
BaseBenchmark
).
IsAssignableFrom
(
type
))
{
if
(
type
!=
typeof
(
BaseBenchmark
))
{
benchmarks
.
Add
(
type
);
}
}
}
return
benchmarks
.
OrderBy
(
b
=>
b
.
Name
).
ToList
();
}
static
void
HandleArguments
(
string
[]
arguments
)
{
if
(
arguments
.
Length
==
0
)
{
return
;
}
// Allow for preselection to avoid developer frustration.
if
(
int
.
TryParse
(
arguments
[
0
],
out
var
benchmarkIndex
))
{
_selectedBenchmarkIndex
=
benchmarkIndex
;
return
;
}
_selectedBenchmarkIndex
=
_benchmarks
.
FindIndex
(
b
=>
b
.
Name
.
Equals
(
arguments
[
0
]));
if
(
_selectedBenchmarkIndex
<
0
)
{
_selectedBenchmarkIndex
=
0
;
}
if
(
_selectedBenchmarkIndex
>
_benchmarks
.
Count
-
1
)
{
_selectedBenchmarkIndex
=
_benchmarks
.
Count
-
1
;
}
}
static
void
RenderMenu
()
{
Console
.
Clear
();
Console
.
WriteLine
(
$"MQTTnet - Benchmarks (
{
TargetFrameworkProvider
.
TargetFramework
}
)"
);
Console
.
WriteLine
(
"-----------------------------------------------"
);
Console
.
ForegroundColor
=
ConsoleColor
.
Yellow
;
Console
.
WriteLine
(
"Press arrow keys for benchmark selection"
);
Console
.
WriteLine
(
"Press Enter for benchmark execution"
);
Console
.
WriteLine
(
"Press Esc for exit"
);
Console
.
ForegroundColor
=
ConsoleColor
.
White
;
Console
.
WriteLine
();
for
(
var
index
=
0
;
index
<
_benchmarks
.
Count
;
index
++)
{
var
benchmark
=
_benchmarks
[
index
];
if
(
_selectedBenchmarkIndex
==
index
)
{
Console
.
Write
(
"-> "
);
}
else
{
Console
.
Write
(
" "
);
}
Console
.
WriteLine
(
benchmark
.
Name
);
}
Console
.
WriteLine
();
}
}
}
\ No newline at end of file
Source/MQTTnet.Benchmarks/RoundtripProcessingBenchmark.cs
浏览文件 @
01a5aeeb
...
...
@@ -8,7 +8,7 @@ namespace MQTTnet.Benchmarks
[
SimpleJob
(
RuntimeMoniker
.
Net60
)]
[
RPlotExporter
,
RankColumn
]
[
MemoryDiagnoser
]
public
class
RoundtripProcessingBenchmark
public
class
RoundtripProcessingBenchmark
:
BaseBenchmark
{
[
GlobalSetup
]
public
void
GlobalSetup
()
...
...
Source/MQTTnet.Benchmarks/ServerProcessingBenchmark.cs
浏览文件 @
01a5aeeb
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using
BenchmarkDotNet.Attributes
;
using
BenchmarkDotNet.Jobs
;
using
MQTTnet.Tests.Mockups
;
...
...
@@ -8,7 +12,7 @@ namespace MQTTnet.Benchmarks
[
SimpleJob
(
RuntimeMoniker
.
Net60
)]
[
RPlotExporter
,
RankColumn
]
[
MemoryDiagnoser
]
public
class
ServerProcessingBenchmark
public
class
ServerProcessingBenchmark
:
BaseBenchmark
{
[
GlobalSetup
]
public
void
GlobalSetup
()
...
...
Source/MQTTnet.Benchmarks/SubscribeBenchmark.cs
浏览文件 @
01a5aeeb
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using
BenchmarkDotNet.Attributes
;
using
BenchmarkDotNet.Jobs
;
using
MQTTnet.Client
;
...
...
@@ -8,7 +12,7 @@ using System.Linq;
namespace
MQTTnet.Benchmarks
{
[
MemoryDiagnoser
]
public
class
SubscribeBenchmark
public
class
SubscribeBenchmark
:
BaseBenchmark
{
MqttServer
_mqttServer
;
IMqttClient
_mqttClient
;
...
...
Source/MQTTnet.Benchmarks/TcpPipesBenchmark.cs
浏览文件 @
01a5aeeb
...
...
@@ -15,7 +15,7 @@ namespace MQTTnet.Benchmarks
{
[
SimpleJob
(
RuntimeMoniker
.
Net60
)]
[
MemoryDiagnoser
]
public
class
TcpPipesBenchmark
public
class
TcpPipesBenchmark
:
BaseBenchmark
{
IDuplexPipe
_client
;
IDuplexPipe
_server
;
...
...
Source/MQTTnet.Benchmarks/TopicFilterComparerBenchmark.cs
浏览文件 @
01a5aeeb
...
...
@@ -11,7 +11,7 @@ namespace MQTTnet.Benchmarks
[
SimpleJob
(
RuntimeMoniker
.
Net60
)]
[
RPlotExporter
]
[
MemoryDiagnoser
]
public
class
TopicFilterComparerBenchmark
public
class
TopicFilterComparerBenchmark
:
BaseBenchmark
{
static
readonly
char
[]
TopicLevelSeparator
=
{
'/'
};
...
...
Source/MQTTnet.Benchmarks/TopicGenerator.cs
浏览文件 @
01a5aeeb
using
System
;
using
System.Collections.Generic
;
using
System.Text
;
namespace
MQTTnet.Benchmarks
{
public
class
TopicGenerator
{
public
static
void
Generate
(
int
numPublishers
,
int
numTopicsPerPublisher
,
out
Dictionary
<
string
,
List
<
string
>>
topicsBy
Publisher
,
out
Dictionary
<
string
,
List
<
string
>>
singleWildcardT
opicsByPublisher
,
out
Dictionary
<
string
,
List
<
string
>>
multiWildcardTopicsByPublisher
)
int
numPublishers
,
int
numTopicsPer
Publisher
,
out
Dictionary
<
string
,
List
<
string
>>
t
opicsByPublisher
,
out
Dictionary
<
string
,
List
<
string
>>
singleWildcardTopicsByPublisher
,
out
Dictionary
<
string
,
List
<
string
>>
multiWildcardTopicsByPublisher
)
{
topicsByPublisher
=
new
Dictionary
<
string
,
List
<
string
>>();
singleWildcardTopicsByPublisher
=
new
Dictionary
<
string
,
List
<
string
>>();
multiWildcardTopicsByPublisher
=
new
Dictionary
<
string
,
List
<
string
>>();
// Find some reasonable distribution across three topic levels
var
topicsPerLevel
=
(
int
)
Math
.
Pow
(
numTopicsPerPublisher
,
(
1.0
/
3.0
)
);
var
topicsPerLevel
=
(
int
)
Math
.
Pow
(
numTopicsPerPublisher
,
1.0
/
3.0
);
if
(
topicsPerLevel
<=
0
)
{
topicsPerLevel
=
1
;
}
int
numLevel1Topics
=
topicsPerLevel
;
int
numLevel2Topics
=
topicsPerLevel
;
var
numLevel1Topics
=
topicsPerLevel
;
var
numLevel2Topics
=
topicsPerLevel
;
var
maxNumLevel3Topics
=
1
+
(
int
)((
double
)
numTopicsPerPublisher
/
numLevel1Topics
/
numLevel2Topics
);
if
(
maxNumLevel3Topics
<=
0
)
...
...
@@ -35,7 +34,7 @@ namespace MQTTnet.Benchmarks
for
(
var
p
=
0
;
p
<
numPublishers
;
++
p
)
{
int
publisherTopicCount
=
0
;
var
publisherTopicCount
=
0
;
var
publisherName
=
"pub"
+
p
;
for
(
var
l1
=
0
;
l1
<
numLevel1Topics
;
++
l1
)
{
...
...
@@ -44,19 +43,22 @@ namespace MQTTnet.Benchmarks
for
(
var
l3
=
0
;
l3
<
maxNumLevel3Topics
;
++
l3
)
{
if
(
publisherTopicCount
>=
numTopicsPerPublisher
)
{
break
;
}
var
topic
=
string
.
Format
(
"{0}/building{1}/level{2}/sensor{3}"
,
publisherName
,
l1
+
1
,
l2
+
1
,
l3
+
1
)
;
var
topic
=
$"
{
publisherName
}
/building
{
l1
+
1
}
/level
{
l2
+
1
}
/sensor
{
l3
+
1
}
"
;
AddPublisherTopic
(
publisherName
,
topic
,
topicsByPublisher
);
if
(
l2
==
0
)
{
var
singleWildcardTopic
=
string
.
Format
(
"{0}/building{1}/+/sensor{2}"
,
publisherName
,
l1
+
1
,
l3
+
1
)
;
var
singleWildcardTopic
=
$"
{
publisherName
}
/building
{
l1
+
1
}
/+/sensor
{
l3
+
1
}
"
;
AddPublisherTopic
(
publisherName
,
singleWildcardTopic
,
singleWildcardTopicsByPublisher
);
}
if
((
l1
==
0
)
&&
(
l3
==
0
))
if
(
l1
==
0
&&
l3
==
0
)
{
var
multiWildcardTopic
=
string
.
Format
(
"{0}/+/level{1}/+"
,
publisherName
,
l2
+
1
)
;
var
multiWildcardTopic
=
$"
{
publisherName
}
/+/level
{
l2
+
1
}
/+"
;
AddPublisherTopic
(
publisherName
,
multiWildcardTopic
,
multiWildcardTopicsByPublisher
);
}
...
...
@@ -75,7 +77,8 @@ namespace MQTTnet.Benchmarks
topicList
=
new
List
<
string
>();
topicsByPublisher
.
Add
(
publisherName
,
topicList
);
}
topicList
.
Add
(
topic
);
}
}
}
}
\ No newline at end of file
Source/MQTTnet.Benchmarks/UnsubscribeBenchmark.cs
浏览文件 @
01a5aeeb
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using
BenchmarkDotNet.Attributes
;
using
MQTTnet.Client
;
using
MQTTnet.Server
;
...
...
@@ -7,7 +11,7 @@ using System.Linq;
namespace
MQTTnet.Benchmarks
{
[
MemoryDiagnoser
]
public
class
UnsubscribeBenchmark
public
class
UnsubscribeBenchmark
:
BaseBenchmark
{
MqttServer
_mqttServer
;
IMqttClient
_mqttClient
;
...
...
Source/MQTTnet.Benchmarks/packages.config
已删除
100644 → 0
浏览文件 @
47df131e
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
<
packages
>
<
package
id
=
"BenchmarkDotNet"
version
=
"0.10.14"
targetFramework
=
"net462"
/>
<
package
id
=
"BenchmarkDotNet.Core"
version
=
"0.10.14"
targetFramework
=
"net462"
/>
<
package
id
=
"BenchmarkDotNet.Toolchains.Roslyn"
version
=
"0.10.14"
targetFramework
=
"net462"
/>
<
package
id
=
"Microsoft.CodeAnalysis.Analyzers"
version
=
"1.1.0"
targetFramework
=
"net462"
/>
<
package
id
=
"Microsoft.CodeAnalysis.Common"
version
=
"2.6.1"
targetFramework
=
"net462"
/>
<
package
id
=
"Microsoft.CodeAnalysis.CSharp"
version
=
"2.6.1"
targetFramework
=
"net462"
/>
<
package
id
=
"Microsoft.DotNet.InternalAbstractions"
version
=
"1.0.0"
targetFramework
=
"net462"
/>
<
package
id
=
"Microsoft.DotNet.PlatformAbstractions"
version
=
"1.1.1"
targetFramework
=
"net462"
/>
<
package
id
=
"Microsoft.Win32.Registry"
version
=
"4.3.0"
targetFramework
=
"net462"
/>
<
package
id
=
"System.AppContext"
version
=
"4.3.0"
targetFramework
=
"net462"
/>
<
package
id
=
"System.Collections"
version
=
"4.3.0"
targetFramework
=
"net462"
/>
<
package
id
=
"System.Collections.Concurrent"
version
=
"4.3.0"
targetFramework
=
"net462"
/>
<
package
id
=
"System.Collections.Immutable"
version
=
"1.3.1"
targetFramework
=
"net462"
/>
<
package
id
=
"System.Console"
version
=
"4.3.0"
targetFramework
=
"net462"
/>
<
package
id
=
"System.Diagnostics.Debug"
version
=
"4.3.0"
targetFramework
=
"net462"
/>
<
package
id
=
"System.Diagnostics.FileVersionInfo"
version
=
"4.3.0"
targetFramework
=
"net462"
/>
<
package
id
=
"System.Diagnostics.StackTrace"
version
=
"4.3.0"
targetFramework
=
"net462"
/>
<
package
id
=
"System.Diagnostics.Tools"
version
=
"4.3.0"
targetFramework
=
"net462"
/>
<
package
id
=
"System.Dynamic.Runtime"
version
=
"4.3.0"
targetFramework
=
"net462"
/>
<
package
id
=
"System.Globalization"
version
=
"4.3.0"
targetFramework
=
"net462"
/>
<
package
id
=
"System.IO.Compression"
version
=
"4.3.0"
targetFramework
=
"net462"
/>
<
package
id
=
"System.IO.FileSystem"
version
=
"4.3.0"
targetFramework
=
"net462"
/>
<
package
id
=
"System.IO.FileSystem.Primitives"
version
=
"4.3.0"
targetFramework
=
"net462"
/>
<
package
id
=
"System.Linq"
version
=
"4.3.0"
targetFramework
=
"net462"
/>
<
package
id
=
"System.Linq.Expressions"
version
=
"4.3.0"
targetFramework
=
"net462"
/>
<
package
id
=
"System.Reflection"
version
=
"4.3.0"
targetFramework
=
"net462"
/>
<
package
id
=
"System.Reflection.Metadata"
version
=
"1.4.2"
targetFramework
=
"net462"
/>
<
package
id
=
"System.Resources.ResourceManager"
version
=
"4.3.0"
targetFramework
=
"net462"
/>
<
package
id
=
"System.Runtime"
version
=
"4.3.0"
targetFramework
=
"net462"
/>
<
package
id
=
"System.Runtime.Extensions"
version
=
"4.3.0"
targetFramework
=
"net462"
/>
<
package
id
=
"System.Runtime.InteropServices"
version
=
"4.3.0"
targetFramework
=
"net462"
/>
<
package
id
=
"System.Runtime.Numerics"
version
=
"4.3.0"
targetFramework
=
"net462"
/>
<
package
id
=
"System.Security.Cryptography.Algorithms"
version
=
"4.3.0"
targetFramework
=
"net462"
/>
<
package
id
=
"System.Security.Cryptography.Encoding"
version
=
"4.3.0"
targetFramework
=
"net462"
/>
<
package
id
=
"System.Security.Cryptography.Primitives"
version
=
"4.3.0"
targetFramework
=
"net462"
/>
<
package
id
=
"System.Security.Cryptography.X509Certificates"
version
=
"4.3.0"
targetFramework
=
"net462"
/>
<
package
id
=
"System.Text.Encoding"
version
=
"4.3.0"
targetFramework
=
"net462"
/>
<
package
id
=
"System.Text.Encoding.CodePages"
version
=
"4.3.0"
targetFramework
=
"net462"
/>
<
package
id
=
"System.Text.Encoding.Extensions"
version
=
"4.3.0"
targetFramework
=
"net462"
/>
<
package
id
=
"System.Threading"
version
=
"4.3.0"
targetFramework
=
"net462"
/>
<
package
id
=
"System.Threading.Tasks"
version
=
"4.3.0"
targetFramework
=
"net462"
/>
<
package
id
=
"System.Threading.Tasks.Extensions"
version
=
"4.3.0"
targetFramework
=
"net462"
/>
<
package
id
=
"System.Threading.Tasks.Parallel"
version
=
"4.3.0"
targetFramework
=
"net462"
/>
<
package
id
=
"System.Threading.Thread"
version
=
"4.3.0"
targetFramework
=
"net462"
/>
<
package
id
=
"System.ValueTuple"
version
=
"4.3.0"
targetFramework
=
"net462"
/>
<
package
id
=
"System.Xml.ReaderWriter"
version
=
"4.3.0"
targetFramework
=
"net462"
/>
<
package
id
=
"System.Xml.XDocument"
version
=
"4.3.0"
targetFramework
=
"net462"
/>
<
package
id
=
"System.Xml.XmlDocument"
version
=
"4.3.0"
targetFramework
=
"net462"
/>
<
package
id
=
"System.Xml.XmlSerializer"
version
=
"4.3.0"
targetFramework
=
"net462"
/>
<
package
id
=
"System.Xml.XPath"
version
=
"4.3.0"
targetFramework
=
"net462"
/>
<
package
id
=
"System.Xml.XPath.XDocument"
version
=
"4.3.0"
targetFramework
=
"net462"
/>
</
packages
>
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录