What’s New in .NET 8?
Part-6
This article is quoted from Microsoft’s official website; however, at the end of each article, you will have access to my own Git project. Thank you for reading. The files will be added to the end of the articles after the .NET 8 series is completed.
Part-1. Part-2. Part-3. Part-4. Part-5.
Performance improvements
.NET 8 includes improvements to code generation and just-in time (JIT) compilation:
- Arm64 performance improvements
- SIMD improvements
- Support for AVX-512 ISA extensions (see Vector512 and AVX-512)
- Cloud-native improvements
- JIT throughput improvements
- Loop and general optimizations
- Optimized access for fields marked with ThreadStaticAttribute
- Consecutive register allocation. Arm64 has two instructions for table vector lookup, which require that all entities in their tuple operands are present in consecutive registers.
- JIT/NativeAOT can now unroll and auto-vectorize some memory operations with SIMD, such as comparison, copying, and zeroing, if it can determine their sizes at compile time.
In addition, dynamic profile-guided optimization (PGO) has been improved and is now enabled by default. You no longer need to use a runtime configuration option to enable it. Dynamic PGO works hand-in-hand with tiered compilation to further optimize code based on additional instrumentation that’s put in place during tier 0.
On average, dynamic PGO increases performance by about 15%. In a benchmark suite of ~4600 tests, 23% saw performance improvements of 20% or more.
Codegen struct promotion
.NET 8 includes a new physical promotion optimization pass for codegen that generalizes the JIT’s ability to promote struct variables. This optimization (also called scalar replacement of aggregates) replaces the fields of struct variables by primitive variables that the JIT is then able to reason about and optimize more precisely.
The JIT already supported this optimization but with several large limitations including:
- It was only supported for structs with four or fewer fields.
- It was only supported if each field was a primitive type, or a simple struct wrapping a primitive type.
Physical promotion removes these limitations, which fixes a number of long-standing JIT issues.
.NET MAUI
For information about what’s new in .NET MAUI in .NET 8, see What’s new in .NET MAUI for .NET 8.
.NET SDK
This section contains the following subtopics:
- CLI-based project evaluation
- Terminal build output
- Simplified output paths
- ‘dotnet workload clean’ command
- ‘dotnet publish’ and ‘dotnet pack’ assets
- Template engine
- Source Link
- Source-build SDK
CLI-based project evaluation
MSBuild includes a new feature that makes it easier to incorporate data from MSBuild into your scripts or tools. The following new flags are available for CLI commands such as dotnet publish to obtain data for use in CI pipelines and elsewhere.
Values are written to the standard output. Multiple or complex values are output as JSON, as shown in the following examples.
.NET CLI
dotnet publish --getProperty:OutputPath
bin\Release\net8.0\
dotnet publish -p PublishProfile=DefaultContainer --getProperty:GeneratedContainerDigest --getProperty:GeneratedContainerConfiguration
{
"Properties": {
"GeneratedContainerDigest": "sha256:ef880a503bbabcb84bbb6a1aa9b41b36dc1ba08352e7cd91c0993646675174c4",
"GeneratedContainerConfiguration": "{\u0022config\u0022:{\u0022ExposedPorts\u0022:{\u00228080/tcp\u0022:{}},\u0022Labels\u0022...}}"
}
}
dotnet publish -p PublishProfile=DefaultContainer --getItem:ContainerImageTags
{
"Items": {
"ContainerImageTags": [
{
"Identity": "latest",
...
]
}
}
Terminal build output
dotnet build
has a new option to produce more modernized build output. This terminal logger output groups errors with the project they came from, better differentiates the different target frameworks for multi-targeted projects, and provides real-time information about what the build is doing. To opt into the new output, use the --tl
option. For more information about this option, see dotnet build options.
Simplified output paths
.NET 8 introduces an option to simplify the output path and folder structure for build outputs. Previously, .NET apps produced a deep and complex set of output paths for different build artifacts. The new, simplified output path structure gathers all build outputs into a common location, which makes it easier for tooling to anticipate.
For more information, see Artifacts output layout.
dotnet workload clean command
.NET 8 introduces a new command to clean up workload packs that might be left over through several .NET SDK or Visual Studio updates. If you encounter issues when managing workloads, consider using workload clean
to safely restore to a known state before trying again. The command has two modes:
dotnet workload clean
- Runs workload garbage collection for file-based or MSI-based workloads, which cleans up orphaned packs. Orphaned packs are from uninstalled versions of the .NET SDK or packs where installation records for the pack no longer exist.
- If Visual Studio is installed, the command also lists any workloads that you should clean up manually using Visual Studio.
dotnet workload clean --all
- This mode is more aggressive and cleans every pack on the machine that’s of the current SDK workload installation type (and that’s not from Visual Studio). It also removes all workload installation records for the running .NET SDK feature band and below.
dotnet publish and dotnet pack assets
Since the dotnet publ
ish and dotnet p
ack commands are intended to produce production assets, they now produce Release
assets by default.
The following output shows the different behavior between dotnet build
and dotnet publish
, and how you can revert to publishing Debug
assets by setting the PublishRelease
property to false
.
Console
/app# dotnet new console
/app# dotnet build
app -> /app/bin/Debug/net8.0/app.dll
/app# dotnet publish
app -> /app/bin/Release/net8.0/app.dll
app -> /app/bin/Release/net8.0/publish/
/app# dotnet publish -p:PublishRelease=false
app -> /app/bin/Debug/net8.0/app.dll
app -> /app/bin/Debug/net8.0/publish/
For more information, see ‘dotnet pack’ uses Release config and ‘dotnet publish’ uses Release config.
dotnet restore security auditing
Starting in .NET 8, you can opt into security checks for known vulnerabilities when dependency packages are restored. This auditing produces a report of security vulnerabilities with the affected package name, the severity of the vulnerability, and a link to the advisory for more details. When you run dotnet add
or dotnet restore
, warnings NU1901-NU1904 will appear for any vulnerabilities that are found. For more information, see Audit for security vulnerabilities.
Template engine
The template engine provides a more secure experience in .NET 8 by integrating some of NuGet’s security-related features. The improvements include:
- Prevent downloading packages from
http://
feeds by default. For example, the following command will fail to install the template package because the source URL doesn't use HTTPS. dotnet new install console --add-source "http://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public/nuget/v3/index.json"
- You can override this limitation by using the
--force
flag. - For
dotnet new
,dotnet new install
, anddotnet new update
, check for known vulnerabilities in the template package. If vulnerabilities are found and you wish to proceed, you must use the--force
flag. - For
dotnet new
, provide information about the template package owner. Ownership is verified by the NuGet portal and can be considered a trustworthy characteristic. - For
dotnet search
anddotnet uninstall
, indicate whether a template is installed from a package that's "trusted"—that is, it uses a reserved prefix.
Source Link
Source Link is now included in the .NET SDK. The goal is that by bundling Source Link into the SDK, instead of requiring a separate <PackageReference>
for the package, more packages will include this information by default. That information will improve the IDE experience for developers.
Source-build SDK
The Linux distribution-built (source-build) SDK now has the capability to build self-contained applications using the source-build runtime packages. The distribution-specific runtime package is bundled with the source-build SDK. During self-contained deployment, this bundled runtime package will be referenced, thereby enabling the feature for users.
Globalization=>Part7
Stackademic
Thank you for reading until the end. Before you go:
- Please consider clapping and following the writer! 👏
- Follow us on Twitter(X), LinkedIn, and YouTube.
- Visit Stackademic.com to find out more about how we are democratizing free programming education around the world.