让我们看一个快速的基准测试 , 看看 byte[] 互操作在 .NET 5 和 .NET6 中的区别 。 以下 Razor 代码创建了一个 22kB 的字节[] , 并将其发送给 Java 的 receiveAndReturnBytes 函数 , 该函数立即返回字节[] 。 这种数据往返重复了10,000次 , 时间数据被打印到屏幕上 。 这段代码对于 .NET 5 和 .NET 6 是相同的 。
<button @onclick="@RoundtripData">Roundtrip Data</button><hr />@Message@code {public string Message { get; set; } = "Press button to benchmark";private async Task RoundtripData{var bytes = new byte[1024*22];List<double> timeForInterop = new List<double>;var testTime = DateTime.Now;for (var i = 0; i < 10_000; i++){var interopTime = DateTime.Now;var result = await JSRuntime.InvokeAsync<byte[]>("receiveAndReturnBytes", bytes);timeForInterop.Add(DateTime.Now.Subtract(interopTime).TotalMilliseconds);}Message = $"Round-tripped: {bytes.Length / 1024d} kB 10,000 times and it took on average {timeForInterop.Average:F3}ms, and in total {DateTime.Now.Subtract(testTime).TotalMilliseconds:F1}ms";}}
接下来我们来看一下 receiveAndReturnBytes Java函数 。 在.NET 5 。 我们必须首先将 Base64 编码的字节数组解码为 Uint8Array , 以便它可以在应用程序代码中使用 。 然后 , 在将数据返回给服务器之前 , 我们必须将其重新编码为 Base64 。
function receiveAndReturnBytes(bytesReceivedBase64Encoded) {const bytesReceived = base64ToArrayBuffer(bytesReceivedBase64Encoded);// Use Uint8Array data in applicationconst bytesToSendBase64Encoded = base64EncodeByteArray(bytesReceived);if (bytesReceivedBase64Encoded != bytesToSendBase64Encoded) {throw new Error("Expected input/output to match.")}return bytesToSendBase64Encoded;}// https://stackoverflow.com/a/21797381function base64ToArrayBuffer(base64) {const binaryString = atob(base64);const length = binaryString.length;const result = new Uint8Array(length);for (let i = 0; i < length; i++) {result[i] = binaryString.charCodeAt(i);}return result;}function base64EncodeByteArray(data) {const charBytes = new Array(data.length);for (var i = 0; i < data.length; i++) {charBytes[i] = String.fromCharCode(data[i]);}const dataBase64Encoded = btoa(charBytes.join(''));return dataBase64Encoded;}编码/解码在客户机和服务器上都增加了巨大的开销 , 同时还需要大量的样板代码 。 那么在.NET 6中如何实现呢? 嗯 , 它相当简单:
function receiveAndReturnBytes(bytesReceived) {// bytesReceived comes as a Uint8Array ready for use// and can be used by the application or immediately returned.return bytesReceived;}因此 , 编写它肯定更容易 , 但它的性能如何呢?分别在 .NET 5 和 .NET6 的 blazorserver 模板中运行这些代码片段 , 在 Release 配置下 , 我们看到 .NET 6 在 byte[]互操作方面有 78% 的性能提升!
请注意 , 流式互操作支持还可以有效下载(大)文件 , 有关更多详细信息 , 请参阅文档 。
InputFile 组件已升级为通过 dotnet/aspnetcore#33900 使用流式传输 。
此外 , 这个字节数组互操作支持在框架中被用来支持 Java 和 .NET 之间的双向流互操作 。 用户现在能够传输任意二进制数据 。 有关从 .NET 流式传输到 Java 的文档可在此处获得 , Java 到 .NET 文档可在此处获得 。
- TechEmpower fortune
https://www.techempower.com/benchmarks/#section=data-r20
- 发布实体框架核心6.0预览版4:性能版的博客文章
特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。