关于JNPF升级的.NET 6技术讲解

2022年5月30日,福建引迈即将上线JNPF开发平台的.NET 6版本,在产品性能上做了深度优化,且极大的提升了工作效率,加强了对云诊断的改进升级,全面提升用户的使用体验。http://www.jnpfsoft.com/?from=CSDNm

 

JNPF是一个以PaaS为核心的零代码开发平台,是一个集PC和APP快速开发、系统管理、流程引擎、权限管理、数据报表、可视化数据源管理与数据构建、数据动态生成与统计、工作流、智能表单设计、微服务等全方位功能于一体的高效、稳定的快速开发平台。

JNPF快速开发平台降低了应用搭建门槛,减轻对专业工程师的依赖,让业务部门用拖拽的方式自行搭建应用平台,满足业务部门个性化需求,降低人力成本减少与IT部门反复沟通的流程缩短项目整体开发周期。在后期运维上,JNPF快速开发平台的迭代速度快,灵活性更高。并且JNPF快速开发平台支持跨平台部署应用,能实现不同系统间数据联通。JNPF快速开发平台相对传统软件开发优势明显,其应用场景也日益丰富。

本次JNPF开发平台.NET 6版本重点优化了产品性能、提升了工作效率,更多详细如下:

●调整了序列化反序列化组件的优化

●调整了WebSocket 组件小组化性能的提高(提高复用性、拓展性)

云服务的改进升级

重构代码生成器生成逻辑,使得代码更简单,算法也得以优化

●兼容C#10 语法,整体提高了代码质量,梳理整体代码,让代码逻辑更符合实际逻辑

●.NET 6 兼容性极强,并且支持向下兼容

即,不止兼容C#10语法,甚至还兼容C#8C#9

●.NET 6 选用lambda 表达式,对技术人员的要求门槛极低,方便企业寻找人才快速开发

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Threading.Tasks;

var tcs = new TaskCompletionSource();
var tasks = new List<Task>();
for (int i = 0; i < Environment.ProcessorCount * 4; i++)
{
    int id = i;
    tasks.Add(Task.Run(() =>
    {
        Console.WriteLine($"{DateTime.UtcNow:MM:ss.ff}: {id}");
        tcs.Task.Wait();
    }));
}
tasks.Add(Task.Run(() => tcs.SetResult()));

var sw = Stopwatch.StartNew();
Task.WaitAll(tasks.ToArray());
Console.WriteLine($"Done: {sw.Elapsed}");

JNPF开发平台.NET 6版本的新特性

●调整了序列化反序列化组件的优化

关于序列化与反序列化

序列化最终的目的是为了对象可以跨平台存储,和进行网络传输。而我们进行跨平台存储和网络传输的方式就是IO,而我们的IO支持的数据格式就是字节数组。

就比如说,如果我们要把一栋房子从一个地方运输到另一个地方去,序列化就是我把房子拆成一个个的砖块放到车子里,然后留下一张房子原来结构的图纸,反序列化就是我们把房子运输到了目的地以后,根据图纸把一块块砖头还原成房子原来面目的过程。

public static ValueTask ExampleAsync()
{
    <ExampleAsync>d__0 stateMachine = default;
    stateMachine.<>t__builder = AsyncValueTaskMethodBuilder.Create();
    stateMachine.<>1__state = -1;
    stateMachine.<>t__builder.Start(ref stateMachine);
    return stateMachine.<>t__builder.Task;
}

●调整了WebSocket 组件小组化性能的提高(提高复用性、拓展性)

WebSocket 是一种网络通信协议。RFC6455定义了它的通信标准。WebSocket 是 HTML5 开始提供的一种在单个TCP连接上进行全双工通讯的协议。

WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket 项目中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

而本次JNPF .NET 6版本,调整了WebSocket 组件小组化提高了性能、复用性及拓展性

public static ValueTask ExampleAsync()
{
    <ExampleAsync>d__0 stateMachine = default;
    stateMachine.<>t__builder = PoolingAsyncValueTaskMethodBuilder.Create();
    stateMachine.<>1__state = -1;
    stateMachine.<>t__builder.Start(ref stateMachine);
    return stateMachine.<>t__builder.Task;
}

云服务的改进升级

体积更小:对于微服务分布式架构而言,更小的体积意味着更少的下载带宽,更快的分发下载速度。

启动速度更快:对于传统单体应用,启动速度与运行效率相比不是一个关键的指标。原因是,这些应用重启和发布频率相对较低。然而对于需要快速迭代、水平扩展的微服务应用而言,更快的的启动速度就意味着更高的交付效率,和更加快速的回滚。·

占用资源更少:运行时更低的资源占用,意味着更高的部署密度和更低的计算成本。.NET 6的CLR启动速度非常快,降低启动时资源消耗,可以减少资源争抢,更好保障其他应用SLA。

支持水平扩展:.NET 6默认更好的支持Docker资源限制,官方团队也在努力让.NET 6成为真正的容器运行时,使其在低内存环境中具有容器感知功能并高效运行。随着内存成本的下降和虚拟化的流行,大内存配比已经成为趋势。

public async Task WithoutPooling()
{
    for (int i = 0; i < Iters; i++)
        await YieldAsync();

    async ValueTask YieldAsync() => await Task.Yield();
}

重构代码生成器生成逻辑,使得代码更简单,算法也得以优化

.NET 6 为System.Text.Json添加了一个源代码生成器,它避免了在运行时进行反射和代码生成的需要,并且可以在构建时生成最佳序列化代码,让代码更简单,算法也得以优化。

序列化程序通常使用非常保守的技术编写,因为它们必须如此。如何使序列化程序在应用时的特定情况下更加优化,这正是这个新的源生成器所做的。除了提高性能减少内存之外,源代码生成器还生成最适合装配修整的代码,这有助于制作更小的应用程序。序列化POCO是一种非常常见的场景,使用新的源代码生成器,我们观察到序列化速度比我们的基准快1.6倍

{
    for (int i = 0; i < Iters; i++)
        await YieldAsync();

    [AsyncMethodBuilder(typeof(PoolingAsyncValueTaskMethodBuilder))]
    async ValueTask YieldAsync() => await Task.Yield();
}

●兼容C#10 语法,整体提高了代码质量,梳理整体代码,让代码逻辑更符合实际逻辑

C#版本今年迭代速度飞快,很多人连C#5.0的await/async还没搞清白,当下都已经到C#10了。

record 的当前实现是使用类(reference type)作为基对象的,在C#10中即将提供一个 record struct,它的基础类型可以是值类型。不同之处在于,常规 record 将通过引用从一个函数传递到另一个函数,而 record struct 将通过其值进行复制。record struct 也将支持 with 表达式。

C#10 的目标之一是使对象的初始化更容易。这就是为什么可以根据需要对 class,struct,record 或 record struct 添加 required 特性标记。它强制要求这些属性必须赋值。这可以通过构造函数来完成,或者可以通过对象初始化来完成。

综上,.NET 6 可兼容C#10 语法,整体提高了代码质量,梳理整体代码,让代码逻辑更符合实际逻辑。

{
    return Task.WhenAll(from i in Enumerable.Range(0, Concurrency)
                        select Task.Run(async delegate
                        {
                            for (int i = 0; i < Iters; i++)
                                await A().ConfigureAwait(false);
                        }));

    static async ValueTask A() => await B().ConfigureAwait(false);

    static async ValueTask B() => await C().ConfigureAwait(false);

    static async ValueTask C() => await D().ConfigureAwait(false);

    static async ValueTask D() => await Task.Yield();
}

●.NET 6 兼容性极强,并且支持向下兼容

即,不止兼容C#10语法,甚至还兼容C#8C#9

JNFP 新版本的兼容性极强,极大的便利了企业,可以在开发工程中的适配多种语法。

除了可兼容C#10语法,还支持向下兼容,包括C#8、C#9等语法。

{
    return Task.WhenAll(from i in Enumerable.Range(0, Concurrency)
                        select Task.Run(async delegate
                        {
                            for (int i = 0; i < Iters; i++)
                                await A().ConfigureAwait(false);
                        }));

    [AsyncMethodBuilder(typeof(PoolingAsyncValueTaskMethodBuilder))]
    static async ValueTask A() => await B().ConfigureAwait(false);

    [AsyncMethodBuilder(typeof(PoolingAsyncValueTaskMethodBuilder))]
    static async ValueTask B() => await C().ConfigureAwait(false);

    [AsyncMethodBuilder(typeof(PoolingAsyncValueTaskMethodBuilder))]
    static async ValueTask C() => await D().ConfigureAwait(false);

    [AsyncMethodBuilder(typeof(PoolingAsyncValueTaskMethodBuilder))]
    static async ValueTask D() => await Task.Yield();
}

●.NET 6 选用lambda 表达式,对技术人员的要求门槛极低,方便企业寻找人才快速开发

C# 的Lambda 表达式都使用 Lambda 运算符 =>,该运算符读为“goes to”。Lambda 用在基于方法的 LINQ 查询中,作为诸如 Where 和 Where 等标准查询运算符方法的参数。

使用基于方法的语法在 Enumerable 类中调用 Where 方法时(像在 LINQ to Objects 和 LINQ to XML 中那样),参数是委托类型 System..::.Func<(Of <(T, TResult>)>)。使用 Lambda 表达式创建委托最为方便。同样,Lambda 表达式只是一种用于构造表达式目录树的非常简练的方式。尽管事实上通过 Lambda 创建的对象的类型是不同的,但 Lambda 使得 Where 调用看起来类似。

而选用lambda 表达式,对技术人员的要求门槛极低,也极大地方便企业寻找人才,从而达到快速开发的目的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值