目前在Azure IoT Edge上创建基于代码的自定义模块有两个主要选项:
所以现在我的问题是,当我想在.NET Core(C#)中编写自定义代码时,使用一个优于另一个会有什么好处?
函数需要的样板代码少得多,但性能如何?
答案 0 :(得分:4)
我不知道。让我们的板凳吧! ...在Windows上导致我有用的东西。 CPU是Core i7-3770K。
.NET Core Web API(v2.1.3,中间件是dotnet new webapi
连接的任何内容) -
public class ValuesController : Controller
{
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
}
Azure Functions脚本宿主(v2.0.11587.0) -
// run.csx
public static IEnumerable<string> Run(HttpRequest req)
{
return new string[] { "value1", "value2" };
}
// host.json
// Default "consoleLevel" is verbose which blocks on flushing stdout,
// performance suffered unnecessarily so i switched to "error".
{
"tracing": {
"consoleLevel": "error",
"fileLoggingMode": "debugOnly"
}
}
结果:
// .NET Core Web API
C:\lab\bomb>bombardier-windows-amd64.exe -n 654321 http://127.0.0.1:5000/api/values
Bombarding http://127.0.0.1:5000/api/values with 654321 requests using 125 connections
654321 / 654321 [===================================] 100.00% 23s
Done!
Statistics Avg Stdev Max
Reqs/sec 27744.21 6713.91 124074.44
Latency 4.45ms 200.44us 46.97ms
HTTP codes:
1xx - 0, 2xx - 654321, 3xx - 0, 4xx - 0, 5xx - 0
others - 0
Throughput: 6.69MB/s
// Functions script host with .csx
C:\lab\bomb>bombardier-windows-amd64.exe -n 654321 http://127.0.0.1:7071/api/HttpTrigger
Bombarding http://127.0.0.1:7071/api/HttpTrigger with 654321 requests using 125 connections
654321 / 654321 [===================================] 100.00% 5m31s
Done!
Statistics Avg Stdev Max
Reqs/sec 1976.64 181.69 4213.32
Latency 63.23ms 20.74ms 2.12s
HTTP codes:
1xx - 0, 2xx - 654321, 3xx - 0, 4xx - 0, 5xx - 0
others - 0
Throughput: 492.23KB/s
为了科学,我在v2(.NET Core)和v1(.NET Full Framework)运行时也进行了预编译函数(.DLL)的测试运行。
.NET Core Web API (v2.1.3): 27744 requests/sec
Functions script host (v2.0.11587.0) .csx: 1976 requests/sec
Functions script host (v2.0.11587.0) precompiled DLL: 2062 requests/sec
Functions script host (v1.0.11535.0) precompiled DLL: 4734 requests/sec
YMMV。如果您真正处理某些IO而不仅仅是从内存中返回16字节,那么事情可能会有所不同。但是它就是这样啊。如果你不需要额外的好东西,功能给你,去原始的dotnet。
答案 1 :(得分:1)
除了表演方面我还没有得到任何答案,这是我最后一次采取的行动:
对于任何其他自定义模块,我很可能会去构建自己的东西。如前所述,从模板开始,编写自己的模块非常简单。
希望能帮助别人! (这不是微软官方的回答;))
您可以在我的github仓库中找到不同触发边缘功能的一些示例:https://github.com/sebader/azureiotedge/tree/master/edge-functions