.NET 10, kế thừa từ .NET 9, được hỗ trợ trong ba năm như một bản phát hành hỗ trợ dài hạn (LTS).
Giải thích thuật ngữ
- Giải ảo hóa (Devirtualization): Quá trình tối ưu hóa trong trình biên dịch JIT, giúp thay thế một lời gọi phương thức ảo (virtual method) bằng một lời gọi trực tiếp đến phương thức cụ thể của đối tượng, giúp tăng hiệu năng thực thi.
- Nội tuyến (Inlining): Quá trình mà trình biên dịch JIT thay thế một lời gọi hàm bằng nội dung của chính hàm đó để giảm overhead của việc gọi hàm, giúp tăng tốc độ thực thi mã.
- AVX (Advanced Vector Extensions): Tập lệnh SIMD (Single Instruction, Multiple Data) mở rộng trên CPU x86, giúp tăng tốc các phép toán xử lý song song như đồ họa, AI, và tính toán khoa học.
Thư viện .NET
Thư viện .NET 10 giới thiệu một số tính năng và cải tiến mới, bao gồm:
Tìm chứng chỉ bằng dấu vân tay khác SHA-1: Một phương thức mới cho phép tìm chứng chỉ sử dụng các thuật toán băm như SHA-256.Microsoft Learn+1Microsoft Learn+1
Tìm dữ liệu mã hóa PEM trong ASCII/UTF-8: Các API mã hóa PEM hiện hỗ trợ đọc trực tiếp từ dữ liệu ASCII/UTF-8.Microsoft Learn
Hỗ trợ ISOWeek cho DateOnly: Các overload mới trong lớp ISOWeek hỗ trợ kiểu DateOnly.Microsoft Learn
API chuẩn hóa chuỗi cho spans: Các API mới cho phép chuẩn hóa chuỗi Unicode hoạt động với spans của kiểu char không chỉ string, giảm việc cấp phát bộ nhớ.
So sánh chuỗi theo thứ tự số học: Tùy chọn CompareOptions.NumericOrdering mới cho phép so sánh chuỗi theo thứ tự số học. Ví dụ, "2"
sẽ đứng trước "10"
khi sắp xếp theo thứ tự số học.
StringComparer numericStringComparer = StringComparer.Create(CultureInfo.CurrentCulture, CompareOptions.NumericOrdering);
Tính năng này hữu ích khi cần sắp xếp các chuỗi chứa số theo cách mà con người mong đợi.
Overload mới cho TimeSpan.FromMilliseconds: Overload một tham số giải quyết các vấn đề với biểu thức LINQ. Các biểu thức LINQ không thể xử lý các tham số tùy chọn, dẫn đến lỗi biên dịch. Để giải quyết vấn đề này, .NET 10 đã thêm một overload mới nhận một tham số duy nhất và thay đổi overload hiện có để làm cho tham số thứ hai trở thành bắt buộc:
public readonly struct TimeSpan
{
public static TimeSpan FromMilliseconds(long milliseconds, long microseconds); // Tham số thứ hai không còn là tùy chọn
public static TimeSpan FromMilliseconds(long milliseconds); // Overload mới
}
Cải tiến hiệu năng ZipArchive: Tối ưu hóa giảm sử dụng bộ nhớ và cải thiện hiệu năng cho ZipArchive trong chế độ ‘Update’ và trích xuất song song.Microsoft Learn
Cải tiến OrderedDictionary: Các overload mới của ‘TryAdd’ và ‘TryGetValue’ trả về chỉ mục để truy cập nhanh hơn.Microsoft Learn
Cập nhật tuần tự hóa JSON: Trình tạo mã nguồn hiện cho phép chỉ định ‘ReferenceHandler’ trong JsonSourceGenerationOptionsAttribute.Microsoft Learn
Biến đổi ma trận tay trái: Các API mới cho phép tạo các ma trận biến đổi tay trái.
Cải tiến xuất PKCS#12: Các phương thức mới cho phép chỉ định thuật toán mã hóa và băm cho xuất PKCS#12/PFX.Microsoft Learn
Runtime .NET
Runtime .NET 10 giới thiệu các tính năng mới và cải tiến hiệu năng. Các cập nhật chính bao gồm:
Giải ảo hóa phương thức giao diện của mảng:
Trình biên dịch JIT hiện có thể giải ảo hóa và nội tuyến các phương thức giao diện của mảng, cải thiện hiệu năng cho việc liệt kê mảng.
Một trong những trọng tâm của .NET 10 là giảm chi phí trừu tượng của các tính năng ngôn ngữ phổ biến. Để đạt được mục tiêu này, khả năng của JIT trong việc giải ảo hóa các lời gọi phương thức đã mở rộng để bao gồm các phương thức giao diện mảng.Microsoft Learn
Xem xét cách tiếp cận thông thường để lặp qua một mảng:
static int Sum(int[] array)
{
int sum = 0;
for (int i = 0; i < array.Length; i++)
{
sum += array[i];
}
return sum;
}
Hình thức mã này dễ dàng cho JIT tối ưu hóa, chủ yếu vì không có lời gọi ảo nào cần xử lý. Thay vào đó, JIT có thể tập trung vào việc loại bỏ các kiểm tra giới hạn trên truy cập mảng và áp dụng các tối ưu hóa vòng lặp đã được thêm vào trong .NET 9.Microsoft Learn
Ví dụ sau thêm một số lời gọi ảo:
static int Sum(int[] array)
{
int sum = 0;
IEnumerable<int> temp = array;
foreach (var num in temp)
{
sum += num;
}
return sum;
}
Loại của bộ sưu tập cơ bản rõ ràng, và JIT nên có thể chuyển đổi đoạn mã này thành đoạn đầu tiên. Tuy nhiên, các giao diện mảng được triển khai khác biệt so với các giao diện “thông thường”, khiến JIT không biết cách giải ảo hóa chúng. Điều này có nghĩa là các lời gọi enumerator trong vòng lặp foreach
vẫn là ảo, ngăn chặn nhiều tối ưu hóa như nội tuyến và cấp phát trên stack.Microsoft Learn
Bắt đầu từ .NET 10, JIT có thể giải ảo hóa và nội tuyến các phương thức giao diện mảng. Đây là bước đầu tiên trong nhiều bước để đạt được hiệu năng tương đương giữa các triển khai, như được chi tiết trong kế hoạch giảm trừu tượng của .NET 10.
Giảm thiểu trừu tượng hóa khi liệt kê mảng:
Những cải tiến giúp giảm chi phí trừu tượng khi lặp qua mảng bằng các bộ liệt kê, cho phép trình biên dịch JIT thực hiện nội tuyến và cấp phát bộ nhớ ngăn xếp hiệu quả hơn. Ví dụ, chi phí của việc liệt kê mảng thông qua IEnumerable
được giảm, và phân tích thoát có điều kiện hiện cho phép cấp phát trên stack của các enumerator trong một số trường hợp. Để biết thêm thông tin.
Nội tuyến các phương thức được giải ảo hóa muộn:
Trình biên dịch JIT giờ đây có thể nội tuyến các phương thức trở nên đủ điều kiện để giải ảo hóa do quá trình nội tuyến trước đó.
Giải ảo hóa dựa trên quan sát nội tuyến:
Trình biên dịch JIT sử dụng thông tin kiểu chính xác từ quá trình nội tuyến để giải ảo hóa các lệnh gọi tiếp theo.
Cấp phát ngăn xếp cho mảng kiểu giá trị:
Các mảng nhỏ, có kích thước cố định của các kiểu giá trị không chứa con trỏ GC giờ đây có thể được cấp phát trên ngăn xếp.
Hỗ trợ AVX10.2:
Giới thiệu hỗ trợ cho Advanced Vector Extensions (AVX) 10.2 cho các bộ xử lý dựa trên x64, mặc dù hiện tại tính năng này được tắt theo mặc định.
Cải tiến NativeAOT:
Hỗ trợ ép kiểu và phủ định trong bộ khởi tạo trước kiểu của NativeAOT.
SDK .NET
SDK .NET 10 giới thiệu các tính năng và cải tiến mới, bao gồm:
Loại bỏ các tham chiếu gói do framework cung cấp:
Bắt đầu từ .NET 10, tính năng NuGet Audit có thể tự động loại bỏ (prune) các tham chiếu gói do framework cung cấp mà không được sử dụng trong dự án.
🔹 Cơ chế hoạt động:
- Tính năng này được bật mặc định cho tất cả các framework đích (target frameworks) như
net8.0
,net10.0
, và.NET Standard 2.0+
. - Khi được kích hoạt, tính năng này loại bỏ các gói không cần thiết, giúp:
- Giảm số lượng gói cần khôi phục và phân tích trong quá trình build.
- Tăng tốc độ build và tiết kiệm dung lượng ổ đĩa.
- Giảm cảnh báo sai từ NuGet Audit và các công cụ kiểm tra dependency khác.
🔹 Ảnh hưởng đến tệp .deps.json:
- Khi tính năng này được bật, tệp
.deps.json
được tạo ra cho ứng dụng sẽ nhỏ hơn do các tham chiếu gói do runtime .NET cung cấp bị loại bỏ tự động.
🔹 Cách tắt tính năng này:
Nếu muốn tắt tính năng này, bạn có thể đặt thuộc tính sau trong file cấu hình dự án (.csproj
) hoặc Directory.Build.props
:
Thứ tự lệnh nhất quán hơn:
Các command mới cho lệnh ‘dotnet’ theo cấu trúc danh từ-động từ cải thiện khả năng đọc và tính nhất quán.Microsoft Learn
dotnet package add
dotnet package list
dotnet package remove
dotnet reference add
dotnet reference list
dotnet reference remove
Để lại một bình luận
Bạn phải đăng nhập để gửi bình luận.