最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊

重磅:.NET 6 發(fā)布首個(gè)預(yù)覽版

2021-02-19 09:42 作者:朝夕教育  | 我要投稿

前言

2021 年 2 月 17 日微軟發(fā)布了 .NET 6 的 Preview 1 版本,那么來看看都有什么新特性和改進(jìn)吧,由于內(nèi)容太多了因此只介紹一些較為重點(diǎn)的項(xiàng)目。ASP.NET Core 6 Preview 1 和 EF Core 6 Preview 1 同樣有很多的更新內(nèi)容,但是限于篇幅就不在這里介紹了。

統(tǒng)一和擴(kuò)展

.NET 6 在 .NET 5 的統(tǒng)一的基礎(chǔ)之上,繼續(xù)借助 Xamarin 擴(kuò)展到 Android、iOS 和 macOS。此外,.NET 6 還擴(kuò)展了 Blazor 的適用范圍,開發(fā)者可以通過 Blazor Hybrid 開發(fā)混合的跨平臺(tái)客戶端應(yīng)用。

對于 Andriod、iOS 和 WebAssembly 將使用 mono 作為 runtime,但是基礎(chǔ)庫將全面與 .NET 統(tǒng)一。

安裝了 .NET 6 的 SDK 之后,將能構(gòu)建移動(dòng)平臺(tái)應(yīng)用,例如對于安卓來說,運(yùn)行 dotnet new andriod 就能創(chuàng)建一個(gè)安卓應(yīng)用的項(xiàng)目,然后運(yùn)行 dotnet run 便能直接啟動(dòng)安卓模擬器運(yùn)行。

另外,為了統(tǒng)一、簡化并擴(kuò)展構(gòu)建 Xamarin.Forms 應(yīng)用,也將推出 MAUI 提供諸多改進(jìn)和功能,允許開發(fā)者直接使用 .NET 開發(fā)桌面和移動(dòng)客戶端程序。

主題

微軟利用 Blazor Server 開發(fā)了 themesof.net 用于展示和跟蹤主題,用戶可以通過查看該網(wǎng)站中列出的各項(xiàng)目內(nèi)容來跟蹤 .NET 目前的狀態(tài)和未來的發(fā)展計(jì)劃。

平臺(tái)支持

.NET 6 LTS 將在 2021 年 11 月正式發(fā)布,除了目前支持的平臺(tái)之外,還將支持以下平臺(tái):

  • Android

  • iOS

  • Mac 和 Mac Catalyst(x64 和 M1)

  • Windows Desktop 的 ARM64

MAUI

.NET MAUI (Multi-platform App UI) 是一組現(xiàn)代 UI 框架,在 Xamarin.Forms 的基礎(chǔ)上擴(kuò)展并集成到 .NET 6 中,利用 MAUI 將能夠面向 Android、iOS、macOS 和 Windows 等構(gòu)建應(yīng)用。

在統(tǒng)一的過程中,將會(huì)把 Xamarin.Essentials 庫集成到 MAUI 當(dāng)中,除此之外你將還能容易地利用設(shè)備機(jī)能,例如傳感器、照片庫、聯(lián)系人和存儲(chǔ)等等。

.NET 6 Preview 1 中首先包含了 Android 和 iOS 兩個(gè)平臺(tái)的 MAUI,可以在此處查看示例項(xiàng)目和安裝說明:https://github.com/dotnet/net6-mobile-samples。

未來還將添加 macOS 和 Windows 桌面支持,以及除了 XAML 熱重載之外,還將支持 C# 代碼的熱重載。

對于今天已經(jīng)在使用 Xamarin 構(gòu)建應(yīng)用的開發(fā)者,將會(huì)提供轉(zhuǎn)換工具和遷移指導(dǎo)幫助遷移到 .NET 6,

Hello, .NET 6!

上圖中,Android 和 iOS 應(yīng)用直接通過 dotnet 的命令從命令行中啟動(dòng),分別運(yùn)行在模擬器中,代碼利用了 dotnet-runtimeinfo 在控制臺(tái)中輸出了運(yùn)行時(shí)的信息:應(yīng)用是利用 .NET 的 SDK 開發(fā),在 mono 的運(yùn)行時(shí)之上使用 .NET 的類庫。

Blazor 桌面應(yīng)用

Blazor Desktop 將允許開發(fā)者利用 Blazor 技術(shù)開發(fā)混合客戶端程序,將原生 UI 和 Web 技術(shù)混合起來構(gòu)建原生的客戶端應(yīng)用。

例如你可以直接將 Blazor 作為組件集成到現(xiàn)有的 WPF 應(yīng)用當(dāng)中,下面是幾個(gè)例子:

在 macOS 運(yùn)行的 Blazor 桌面客戶端應(yīng)用:

Blazor桌面應(yīng)用

在 WPF 中集成 Blazor 的混合應(yīng)用:

WPF集成Blazor

快速內(nèi)部循環(huán)

快速迭代開發(fā)是任何高效且令人愉悅的平臺(tái)的標(biāo)志,為此微軟啟動(dòng)了一個(gè)新項(xiàng)目:快速內(nèi)部循環(huán)(fast inner loop)。該項(xiàng)目旨在讓應(yīng)用的構(gòu)建速度大幅度提高,并提供在運(yùn)行時(shí)修改代碼無需重新編譯和重啟應(yīng)用,直接熱重載代碼并應(yīng)用的功能。

幾年來 .NET 一直具有 XAML 熱重載功能,這一次,熱重載功能將不僅局限于 XAML,而是擴(kuò)展到 C# 和 IL。微軟將定義代碼熱重載模型以讓該功能支持所有類型的 app,這其中的一些功能需要通過改進(jìn)運(yùn)行時(shí)來做到,屆時(shí) CoreCLR 和 Mono 將一起受益。

最終通過該項(xiàng)目,開發(fā)者將能夠非??斓臉?gòu)建項(xiàng)目,并且在調(diào)試運(yùn)行時(shí)直接跳過編譯,通過熱重載功能完成代碼的修改,而無需重新啟動(dòng)。

ARM64

.NET 將持續(xù)改進(jìn) ARM64 的支持。

ARM64 的性能改進(jìn)計(jì)劃

.NET 將持續(xù)改善在 ARM64 架構(gòu)上的性能表現(xiàn),具體可以去這里查看 .NET 6 在此方面的計(jì)劃:https://github.com/dotnet/runtime/issues/43629

WPF 支持

WPF 現(xiàn)在支持 Windows ARM64 了,如需反饋相關(guān)問題可以前去:https://github.com/dotnet/wpf/issues/4117

WPF支持Windows ARM64

macOS ARM64 支持

.NET 5 提供對 macOS ARM64 的 x86_64 模擬器支持,而 .NET 6 將提供對 macOS ARM64 的原生支持,下圖中展示了在 macOS 原生運(yùn)行 ARM64 的 .NET:

macOS支持ARM64的.NET

容器

容器是 .NET 團(tuán)隊(duì)的日常工作,既是構(gòu)建基礎(chǔ)結(jié)構(gòu)的基礎(chǔ),又是產(chǎn)品方案,.NET 性能測試也在容器中完成。

在 .NET 6 中將針對如下項(xiàng)目改進(jìn)容器支持:

  • 改善容器的縮放支持,并更好地支持 Windows 進(jìn)程隔離的容器。我們還計(jì)劃了一種針對密度和累加機(jī)器性能的新型容器性能測試。

  • 使用 PGO 減小容器鏡像的大小

  • 通過使用 R2R 版本氣泡來提高啟動(dòng)和吞吐量性能。

  • 默認(rèn)情況下,通過使用現(xiàn)代向量指令來提高啟動(dòng)和吞吐量性能。

  • [高級方案] 為 R2R 合成鏡像啟用大頁面支持

除了第一條之外,上述所有特性都依賴 crossgen2 完成。雖然很多特性和容器沒太多關(guān)系,但是 .NET 將會(huì)在容器中使用他們。

在某些情況下,例如版本氣泡,容器可能是唯一默認(rèn)啟用功能的分發(fā)工具。

容器的一個(gè)重要優(yōu)點(diǎn)是,與更通用的 .tar.gz,.deb 或 .msi 交付方式相比,可以以更“自以為是”的配置提供 .NET,例如提供性能更高配置的容器,但可能無法在所有情況下都可用(例如在舊硬件上)。

.NET 6 鏡像將分別在 Alpine 3.13(或更高)、Debian 11(bullseye)和 Ubuntu 20.04 上構(gòu)建。

主題:PGO - 利用運(yùn)行時(shí)信息提升啟動(dòng)速度和吞吐量性能

本次來介紹一下 PGO 這個(gè)主題,后續(xù)每個(gè) Preview 都將會(huì)介紹一些主題。

PGO(Profile-Guided Optimization) 的目標(biāo)是優(yōu)化二進(jìn)制內(nèi)的原生代碼,讓其在 CPU 和其他方面的計(jì)算機(jī)上執(zhí)行的效率更高。優(yōu)化代碼可以讓程序速度更快,并能減少內(nèi)存使用和硬盤使用?,F(xiàn)在微軟已經(jīng)在 native runtime 上面使用了 PGO,這是由在 Windows、macOS 和 Linux 上使用的 C++ 編譯器提供,雖然這部分內(nèi)容很相關(guān)并重要,但是并不是這里的 PGO 所說的東西。

這里的 PGO 是指優(yōu)化 RyuJIT(.NET 的 JIT)產(chǎn)生的本機(jī)代碼。Crossgen 和 RyuJIT 已經(jīng)支持了 PGO,但是在 .NET 6 中將在可用度和性能上大幅改善該特性。

其中一個(gè) PGO 技術(shù)是冷熱分離:將最常調(diào)用的代碼放在一起(熱),不常調(diào)用的代碼放到另一邊(冷)。理性情況下,由于已處于從磁盤加載的頁面的相同物理順序中,接下來一連串的方法調(diào)用或者基本塊訪問需要的代碼已經(jīng)被載入到了 CPU 的緩存中。這種情況下方法或者塊的調(diào)用將非??臁3松鲜龅睦錈嶂?,還引入了 “非常冷” 這一組,這一組代碼將不會(huì)預(yù)編譯任何的原生代碼,只會(huì)在需要的時(shí)候被 JIT 編譯,這么做將能在不犧牲主要性能的情況下減小程序體積。

PGO 這項(xiàng)技術(shù)雖然不僅僅只在 .NET 中有所應(yīng)用,但是該項(xiàng)技術(shù)非常不流行,因?yàn)樽銎饋矸浅S须y度,而且這類工具通常很笨重,并且在處理過程中需要非常注意細(xì)節(jié):開發(fā)者必須定期進(jìn)行“訓(xùn)練”,在此過程中,需要在各種情況下運(yùn)行程序,同時(shí)工具會(huì)收集程序的運(yùn)行數(shù)據(jù),然后把這些數(shù)據(jù)提供給編譯器,編譯器根據(jù)這些數(shù)據(jù)改善編譯結(jié)果,開發(fā)者接著去驗(yàn)證結(jié)果。這一系列的過程非常麻煩且令人沮喪。

在 .NET 6 中,將計(jì)劃做以下 PGO 相關(guān)的支持:

  • 提供一組容易使用的工具用于 PGO 訓(xùn)練和數(shù)據(jù)分析

  • 為 .NET 庫公開發(fā)布分享訓(xùn)練數(shù)據(jù),以讓其他人能夠使用這些數(shù)據(jù)

  • 在生產(chǎn)環(huán)境中啟用訓(xùn)練數(shù)據(jù)收集

  • 在運(yùn)行時(shí)允許 JIT 使用靜態(tài)訓(xùn)練的數(shù)據(jù)

  • 在運(yùn)行時(shí)允許 JIT 生成和使用動(dòng)態(tài)訓(xùn)練的數(shù)據(jù)(不需要手動(dòng)訓(xùn)練)

PGO 將期望能得到 10% 的啟動(dòng)速度提升和吞吐量性能提升,對于計(jì)算不敏感的工作負(fù)載,提升將更為顯著。

.NET 期望用兩個(gè)大版本的時(shí)間完成此方面完整的企劃。

TFM

完整的 .NET TFM 將包含如下:

  • net6.0

  • net6.0-android

  • net6.0-ios

  • net6.0-maccatalyst

  • net6.0-macos

  • net6.0-tvos

  • net6.0-windows

通過類似?<TargetFramework>net6.0</TargetFramework>?的方式可以適配到不同的平臺(tái)上。

命令行

在 .NET 6 中,對 CLI 也有不少改進(jìn)。

響應(yīng)文件

命令行支持響應(yīng)文件,通過響應(yīng)文件可以繞過控制臺(tái)對于字符數(shù)量的限制,同時(shí)也能減少用戶反復(fù)輸入相同命令的麻煩。

響應(yīng)文件的支持已經(jīng)被添加到 .NET CLI 中,語法是?@file.rsp。而該文件本身就是簡單的一行文本,會(huì)在命令行中被結(jié)構(gòu)化,例如下圖使用響應(yīng)文件進(jìn)行?dotnet build

響應(yīng)文件

新指令

添加了兩個(gè)新的指令:

  • dotnet suggest:用于搜索命令,例如?dotnet suggest buil?將返回?build、build-server?和?msbuild?等搜索結(jié)果

  • dotnet parse:用于解析命令,可用來分析為什么輸入的命令有誤等問題

.NET 6 Preview 1 的類庫新增了一些 API。

System.Numerics 的新數(shù)學(xué) API

  • SinCos:用于同時(shí)計(jì)算?sin?和?cos

  • ReciprocalEstimate:用于估算?1 / x

  • ReciprocalSqrtEstimate:用于估算 `1 / Sqrt(x)``

  • Clamp,?DivRem,?Min?和?Max?支持?nint?和?nuint

  • Abs?和?Sign?支持?nuint

  • DivRem?返回元組的多態(tài)

Windows 訪問控制列表的支持改進(jìn)

用于操作 Windows ACLs 的包System.Threading.AccessControl 已經(jīng)被改進(jìn),為?EventWaitHandle,?Mutex?和?Semaphore?加入了新的?OpenExisting和?TryOpenExisting?方法,允許打開現(xiàn)有的通過特殊 Windows 安全描述符創(chuàng)建的線程同步對象。

運(yùn)行時(shí)

.NET 6 Preview 1 的新運(yùn)行時(shí)特性包含 Apple Silicon 支持、crossgen2 以及部分 PGO 改進(jìn)等等。

可移植線程池

.NET 6 通過托管實(shí)現(xiàn),重新實(shí)現(xiàn)了 .NET 的線程池,并且作為 .NET 默認(rèn)的線程池。

該線程池可以在不同平臺(tái)(CoreCLR、Mono 等)上提供相同的行為。

如果想要恢復(fù)以前用非托管代碼實(shí)現(xiàn)的線程池,可以指定環(huán)境變量?COMPlus_ThreadPool_UsePortableThreadPool=0,不過后續(xù)原來的線程池實(shí)現(xiàn)可能會(huì)被移除。

Apple Silicon 支持

.NET 6 Preview 1 開始原生支持 Apple Silicon,但是目前還處于 alpha 狀態(tài)。

對于 .NET 6,將同時(shí)支持 macOS ARM64 的原生運(yùn)行以及通過羅塞塔 2 模擬運(yùn)行 x64 版本的 .NET。

下面是同一臺(tái) macOS ARM64 機(jī)器上運(yùn)行 .NET 5 和 .NET 6 的輸出,你可以看到區(qū)別:

Apple Silicon原生支持

蘋果的新芯片相對于其他 ARM64 芯片來說有更嚴(yán)格運(yùn)行要求,其中包括對 JIT 的要求,.NET 6 Preview 1 已經(jīng)滿足這些要求。

通用二進(jìn)制(Universal binaries)是發(fā)布到蘋果商店的另一個(gè)新要求,但是目前 .NET 6 應(yīng)用并不支持,因此不能發(fā)布到蘋果的應(yīng)用商店,不過這部分也不是大部分 .NET 開發(fā)者所需要的。如果需要的話,.NET 會(huì)在 .NET 7 重新考慮是否支持通用二進(jìn)制。

為了支持 Apple Silicon ABI 的要求,.NET 已經(jīng)做出了一些改進(jìn),下面是對應(yīng)的 Pull Request:

  • Use bytes in?fgArgTabEntry

  • Support byte sizes from lowering to codegen

  • Preserve precise argument sizes

  • Use 4-byte stack alignment for?hfa<float>

  • Arg alignment

調(diào)試

目前還無法在 Apple Silicon 上面調(diào)試原生 ARM64 的 .NET 程序,這將會(huì)在 Preview 3 或之后提供支持。不過通過羅塞塔 2 模擬運(yùn)行 x64 的運(yùn)行時(shí)是支持調(diào)試的。

已知問題

  • 由于 Apple Silicon 頁面大小為 16K,對于大的棧分配,JIT 無法生成清棧代碼

  • 可靠性不如 x64 版本的

  • 因?yàn)闆]有機(jī)器所以 macOS ARM64 的 CI 還沒有啟用

  • 還沒有設(shè)計(jì)同時(shí)運(yùn)行原生 .NET 和模擬 .NET 的方式,因此如果想要在 macOS ARM64 同時(shí)使用 .NET 6 和 .NET 5,建議通過?.tar.gz?手動(dòng)安裝,而不是通過包管理器直接安裝,以便于控制版本

  • .tar.gz?的包被誤報(bào)成惡意軟件了

羅塞塔 2 仿真

.NET 5 的 x64 版本目前已經(jīng)支持通過羅塞塔 2 仿真運(yùn)行在 macOS ARM64 上。

單文件應(yīng)用

在 .NET 6,完成了用于 Windows 和 macOS 的完全單文件應(yīng)用支持。此前這一項(xiàng)只支持 Linux,所以在其他平臺(tái)即使利用?PublishSingleFile?也還會(huì)帶幾個(gè) .NET 的 dll 或者 dylib 文件。.NET 6 開始,這些文件都將被靜態(tài)鏈接到程序當(dāng)中,變成真正的單文件。

當(dāng)然,這只是對于 runtime 而言的,如果你的程序引用了其他的 native 庫,那么這些庫還是會(huì)外帶,而不會(huì)被鏈接進(jìn)去。

macOS 單文件應(yīng)用簽名

.NET 6 的單文件應(yīng)用現(xiàn)在滿足了蘋果的公證和簽名要求,相關(guān)改動(dòng)可以參考:https://github.com/dotnet/runtime/issues/3671。

Crossgen2

Crossgen2 將代替原有的 crossgen,旨在帶來如下優(yōu)點(diǎn):

  • 使 crossgen 更加高效并啟用現(xiàn)有 crossgen 無法啟用的一些特性

  • PGO 相關(guān)的計(jì)劃取決于 crossgen2,影響 R2R 代碼生成。.NET 6 中有 6 個(gè)項(xiàng)目依賴 crossgen2,這個(gè)東西非常重要

  • 允許在不同系統(tǒng)和架構(gòu)之間交叉編譯

目前 .NET 的核心庫 System.Private.Corelib 本身已經(jīng)使用了 crossgen2 進(jìn)行預(yù)編譯了,后面將會(huì)把整個(gè) .NET 自身利用 crossgen2 進(jìn)行預(yù)編譯。

這個(gè)項(xiàng)目并不是為了改進(jìn)性能的,而是為托管 RyuJIT 提供更好的體系結(jié)構(gòu),在不需要或者不啟動(dòng)運(yùn)行時(shí)的情況下以“離線”方式生成代碼,以便更好地支持交叉編譯。

動(dòng)態(tài) PGO

動(dòng)態(tài) PGO是 .NET 正在探索和啟用的PGO模式之一。一方面,可以將其視為“無需訓(xùn)練” 的 PGO。在文章的前面,我描述了 PGO 的使用過程,而動(dòng)態(tài)PGO的優(yōu)點(diǎn)是不需要任何這些,但是缺點(diǎn)是過程需要更長的時(shí)間才能達(dá)到最佳性能。

另一方面,動(dòng)態(tài) PGO 可以被認(rèn)為是當(dāng)今分層編譯所使用的更為簡單(且效果較差)的策略的替代品。

最引人注目案例中,動(dòng)態(tài) PGO 和靜態(tài) PGO 組合到了一起。在運(yùn)行時(shí), JIT 可以細(xì)化一小部分經(jīng)過靜態(tài)編譯的 PGO 優(yōu)化代碼,以提供最大的好處。

例如,JIT 可以注意到,在到目前為止已加載的過程中,只有一個(gè)類實(shí)現(xiàn)了給定的接口,然后,JIT 可以生成通過類直接調(diào)用的代碼,而不是通過接口間接調(diào)用。

這種經(jīng)典的編譯器技術(shù)稱為去虛擬化,它通過消除方法調(diào)用中的間接操作并啟用內(nèi)聯(lián)來提高性能。

作為啟用動(dòng)態(tài) PGO 的一部分,.NET 已經(jīng)做出了如下改動(dòng):

  • Guarded devirtualization:通過類概要文件和針對類類型的探針啟用受保護(hù)的去虛擬化

  • Flowgraph visualizations:帶有配置文件數(shù)據(jù)的流程圖的圖形轉(zhuǎn)儲(chǔ)

  • Redundant branch elimination:優(yōu)化完全確定分支結(jié)果的分支

  • Enable CSE for PGO scenarios:為 PGO 引入的類型測試啟用 CSE

ARM64 性能

Preview 1 中包含了以下改進(jìn):

  • Stack frame zeroing:使用 SIMD 清零初始幀

Stack frame zeroing

上圖展示了改進(jìn)帶來的影響,數(shù)值越低越好。綠色線是改進(jìn)之后的,橘色是另一個(gè)實(shí)驗(yàn)性改進(jìn)的,藍(lán)色是原來的。

硬件加速的 struct

struct 值類型是 .NET 中很重要的性能工具,被頻繁使用,但是此前 struct 并沒有在 JIT 中得到應(yīng)得的優(yōu)化。在 .NET 5 和 .NET 6 中,將針對 struct 進(jìn)行性能優(yōu)化,一部分是確保 struct 能夠被加載到 CPU 寄存器中進(jìn)行訪問。

Preview 1 中包含如下改進(jìn):

  • Struct promotion for HFAs:Struct promotion for HFA and non-HFA multireg args on x64 and Arm64

  • Enregister HFAs:Enregister HFAs and other structs with matching fields

結(jié)語

以上就是個(gè)人認(rèn)為值得關(guān)注的 .NET 6 Preview 1 帶來的新特性了,后續(xù)還會(huì)有十個(gè)左右的預(yù)覽版本,會(huì)包含更多的新增和改進(jìn)內(nèi)容,敬請期待吧。

?

作者:hez2010

出處:https://www.cnblogs.com/hez2010/p/dotnet-6-preview-1.html

原文:https://devblogs.microsoft.com/dotnet/announcing-net-6-preview-1/


重磅:.NET 6 發(fā)布首個(gè)預(yù)覽版的評論 (共 條)

分享到微博請遵守國家法律
安康市| 镇巴县| 辽中县| 道孚县| 织金县| 来宾市| 德钦县| 武隆县| 衡水市| 盐城市| 海门市| 视频| 桃园县| 陈巴尔虎旗| 双牌县| 海城市| 榆林市| 通渭县| 四会市| 延川县| 阿鲁科尔沁旗| 秦安县| 康保县| 衡东县| 建宁县| 商南县| 冷水江市| 济阳县| 正安县| 洪湖市| 平潭县| 冀州市| 江山市| 巴东县| 周宁县| 利川市| 崇文区| 西城区| 清远市| 武川县| 淳安县|