.net-core - Raspberry Pi 2 上的 dotnet 核心速度很慢
问题描述
Dotnet 核心运行时在 Raspberry Pi 2 上启动缓慢
Raspberry Pi 2 是使用来自 Raspbian 站点的 Lite (Raspbian 10, Buster) tar 文件设置的。
我安装了openssh、php7.1、dotnet runtime 和mono。我已经在一个单独的 linux 机器上运行了一个 RabbitMQ 服务器。
我正在使用 RabbitMQ 站点https://www.rabbitmq.com/getstarted.html上的入门示例 #1 (hello-world) 发送代码
在我的 Raspberry Pi 2 上,我安装了以下内容
- PHP 7.1 用于在 CLI 上测试 PHP 发送代码
- 用于测试 C# 发送代码的 dotnet 2.2 核心(作为控制台应用程序)
- mono 用于测试 C# 发送代码为 Framework 4.7.2(作为控制台应用程序)
添加到示例教程代码中,我添加了秒表,以便我可以测量经过的时间。
结果如下
- dotnet - 经过时间 = 00:00:07.1991475
- 单声道 - 经过时间 = 00:00:04.3602941
- php - 经过时间 = 00:00:00.1396138
我的印象是 Dotnet 核心中的编码会比框架(使用单声道)更快。
所以我认为它可能是 RabbitMQ 库(NuGet - RabbitMq.Client)
因此决定在 console.write 中只使用 Hello World 创建两个新项目。
结果非常相似。
- dotnet - 7 秒
- 单声道 - 4 秒
- php - 0 秒
我希望用 C# 编写我的应用程序,但除非我能解决性能问题,否则 PHP 似乎是我项目的最佳选择。
有什么我可以尝试提高性能的吗?
经过大量搜索,我发现了类似的问题,但是这些文章很旧,并且在早期版本中提到了 dotnet core 2.1。我有点希望通过 dotnet core 2.2 版本支持的 Arm CPU 会更好。尤其是在推动物联网方面。
我在 Raspberry Pi 2 中运行的 Arm CPU 是 ARMv7 rev 5 (v71)。
我尝试了 Raspberry Pi 1、2 和 3,但遗憾的是结果相同。除了在 Raspberry Pi 1 上,您无法安装 dotnet(在 ARMv6 CPU 上不支持),因此仅对 mono 和 PHP 进行了测试。
有任何想法吗....
解决方案
为了缩短启动时间,您可以根据指导和我的经验做一些事情。
如果可能的话,将您的应用迁移到 dotnetcore3.0,这似乎具有显着的性能和启动优势。
在您的 csproj 中启用分层编译。如此处所述https://docs.microsoft.com/en-us/dotnet/core/whats-new/dotnet-core-3-0#tiered-compilation
<PropertyGroup> <TieredCompilationQuickJit>true</TieredCompilationQuickJit> <TieredCompilation>true</TieredCompilation> </PropertyGroup>
- 通过在您的 csproj 中启用它来使用 ReadyToRun 图像。如此处所述https://docs.microsoft.com/en-us/dotnet/core/whats-new/dotnet-core-3-0#tiered-compilation 在 csproj 中。
在发布单个 exe 时,还可以考虑使用修剪功能来减少二进制文件的大小。这减少了执行应用程序需要从磁盘读取的数据量。
这个问题也在 Amazon Lambda的上下文中讨论过,冷启动时间非常长。 到目前为止,似乎最好的方法是减少 dll 大小,使用 ReadyToRun 来减少 JIT 时间和分层编译。当与 dotnetcore3.0 结合使用时,这些更改对我们非常有效。
Scott Hanselman 在这里提供了一些指导https://www.hanselman.com/blog/MakingATinyNETCore30EntirelySelfcontainedSingleExecutable.aspx
推荐阅读
- vba - 使用变量更新表
- macos - 如何保护 Mac OS 系统扩展安全端点不被杀死
- flutter - 无法重置 FormBuilder()
- javascript - Javascript 数字不在具有功能的输入字段中
- php - 在移动设备上隐藏 HTML
- python - 如何在 yocto poky 层中启用 python 脚本的日志记录?
- python - xdist 在 pytest 中将对象作为参数传递时显示错误
- sql - SQL - 查找净新和净变化(收益/损失)访问者
- flutter - 如何在 Flutter 或 Dart 中将字符串编码为 RFC 3986?
- c++ - 当对象很大时返回一个指针或值