我为 UDP 套接字做了一个简单的 SendReceive 基准测试,并注意到 Windows 安全模式下的性能比正常模式下的性能要快得多。为什么会这样?在正常模式下,我非常小心地终止了任何不必要的进程,并且在基准测试运行时也没有看到任何其他进程占用 CPU 时间(例如 Defender)。您可以使用 github 上的 repo 重现该问题:https://github.com/JohannesDeml/MicroBenchmarksDotNet。
我最初在对成熟的低级网络库进行基准测试时注意到了这个问题(网络基准DotNet)。
基准测试结果如下:
方法 | 图书馆 | 安全模式(毫秒) | 正常模式(毫秒) | 减速 |
---|---|---|---|---|
PingPong不可靠 | 恩特 | 2,798.70 | 5,003.60 | 78.78% |
PingPongBatched不可靠 | 恩特 | 488.4 | 668.2 | 36.81% |
PingPong不可靠 | NetCore服务器 | 4,101.40 | 6,642.10 | 61.95% |
PingPongBatched不可靠 | NetCore服务器 | 3,580.80 | 6,037.30 | 68.60% |
PingPong不可靠 | 精简网络库 | 2,873.40 | 5,161.40 | 79.63% |
PingPongBatched不可靠 | 精简网络库 | 535.7 | 573 | 6.96% |
所有详细信息可在此找到Google 电子表格。
对于正常模式和安全模式,我在管理员模式下使用命令行并尝试不运行其他进程(请参阅上面的电子表格,了解在两个实例中运行的所有进程的详细列表)。我还将基准测试文件夹和 dotnet sdk 文件夹添加到 Windows Defender 防病毒排除列表中。当我在正常模式下运行基准测试时,我也看不到任何其他进程在 CPU 上旋转。
为什么正常模式和安全模式之间会有如此大的差异?当我在网上搜索时,我找不到任何解释或说明套接字被限制或类似情况?知道我在正常模式下可以尝试什么来获得相同的性能统计数据吗?