做好毫秒级的C#执行器要考虑哪些因素?

💡 原文中文,约4000字,阅读约需10分钟。
📝

内容提要

在冷启动场景下,目标是将未知的C#代码在≤100毫秒内编译并执行。使用.NET 10.0的单文件执行功能测试发现速度仍需提升,而LINQPad基于Roslyn Scripting API的执行速度更快。为确保安全性,需使用Docker并解决冷启动性能问题,最终目标是实现高效、安全的代码执行。

🎯

关键要点

  • 目标是在冷启动场景下将未知的C#代码编译并执行到≤100毫秒,理想为<20毫秒。
  • 使用.NET 10.0的单文件执行功能测试发现速度仍需提升,LINQPad基于Roslyn Scripting API的执行速度更快。
  • LINQPad的执行几乎无感,因其使用Roslyn Scripting API,且进程常驻,CLR已加载完毕。
  • 使用Roslyn Scripting API可以显著提升执行速度,达到10毫秒以内。
  • 使用Roslyn Scripting API的代价包括需要管理NuGet和不支持某些功能。
  • 为了确保安全性,需要使用Docker,并解决冷启动性能问题。
  • 安全性要求包括限制代码访问用户对象、内核对象、CPU使用率、内存占用和执行时间。
  • 建议提前启动、预热和待命Docker,以适应多线程访问需求。
  • Host进程和Docker进程之间通过HTTP请求进行管理,可能不在同一台机器上。
  • 目前Docker Runner的冷启动时间约为60毫秒,数据变化在30毫秒到100毫秒之间。

延伸问答

如何在冷启动场景下实现C#代码的快速执行?

目标是在冷启动场景下将未知的C#代码编译并执行到≤100毫秒,理想为<20毫秒。

LINQPad与.NET 10.0在执行速度上有什么区别?

LINQPad基于Roslyn Scripting API,执行速度更快,几乎无感,而.NET 10.0的单文件执行速度仍需提升。

使用Roslyn Scripting API有什么优势和代价?

优势是可以显著提升执行速度,达到10毫秒以内;代价包括需要管理NuGet和不支持某些功能。

在执行未知代码时如何确保安全性?

需要使用Docker,并限制代码访问用户对象、内核对象、CPU使用率、内存占用和执行时间。

如何优化Docker的冷启动性能?

建议提前启动、预热和待命Docker,以适应多线程访问需求。

Docker Runner的冷启动时间大约是多少?

目前Docker Runner的冷启动时间约为60毫秒,数据变化在30毫秒到100毫秒之间。

➡️

继续阅读