Tốc độ cực kỳ quan trọng và nó là một nhân tố chính cho sự thành công của bất cứ ứng dụng web bào. ASP.NET Core 3 cung cấp một số các cải tiến để thu hồi bộ nhớ sử dụng và tối ưu nó. Trong bài viết này mình sẽ đưa ra 10 mẹo để giúp bạn tăng tốc ứng dụng ASP.NET Core 3 bằng cách làm những việc sau đây:
Cố gắng tránh các lệnh gói đồng bộ (synchronous) khi phát triển ứng dụng ASP.NET Core 3. Lệnh gọi đồng bộ sẽ block các lệnh thực hiện sau nó cho đến khi nó xử lý xong. Khi lấy dữ liệu từ API hoặc thực hiện một tác vụ như là I/O (input/output) tốn thời gian thì nên xử lý nó theo cách bất đồng bộ.
Tránh dùng Task.Wait và Task.Result, và nên sử dụng từ khóa await. Đoạn code sau là ví dụ.
public class WebHost
{
public virtual async Task StartAsync(CancellationToken cancellationToken = default)
{
// Fire IHostedService.Start
await _hostedServiceExecutor.StartAsync(cancellationToken).ConfigureAwait(false);
// More setup
await Server.StartAsync(hostingApp, cancellationToken).ConfigureAwait(false);
// Fire IApplicationLifetime.Started
_applicationLifetime?.NotifyStarted();
// Remaining setup
}
}
Entity Framework 3.0 Core cũng cung cấp các extension method dạng async cho LINQ, để thực thi query và lấy kết quả.
Truy vấn bất đồng bộ tránh việc bị block một thread trong khi thực thi câu lệnh vào database. Truy vấn bất đồng bộ thì ưu tiên nhanh để có trải nghiệm người dùng tốt.
Ví dụ:
public async Task<List> GetBlogsAsync()
{
using (var context = new BloggingContext())
{
return await context.Blogs.ToListAsync();
}
}
Lưu dữ liệu bất đồng bộ tránh việc block thread khi các thay đổi được lưu vào database. EF Core cung cấp phương thức DbContext.SaveChangesAsync() như một lệnh lưu thay vì DbContext.SaveChanges()
public static async Task AddBlogAsync(string url)
{
using (var context = new BloggingContext())
{
var blogContent = new BlogContent { Url = url };
context.Blogs.Add(blogContent);
await context.SaveChangesAsync();
}
}
Tăng hiệu năng cho ứng dụng bằng việc tối ưu hóa việc truy cập dữ liệu. Hầu hết ứng dụng đều phụ thuộc cơ sở dữ liệu. Chúng phải lấy dữ liệu ra, xử lý sau đó hiển thị. Nếu nó chiếm nhiều thời gian, ứng dụng sẽ phải tốn thêm time để chạy.
Đề xuất:
Bạn có thể tìm thấy các best practice trong tính năng mới của EF Core 3.0
Tăng tốc độ của ứng dụng bằng việc giảm số lần request đến server. Tránh gọi liên tục và thay vào đó là cache các dữ liệu thường xuyên gọi nhưng ít thay đổi. Lưu lại cho các request sau này và sử dụng chúng để trả về.
Có một số các kỹ thuật cache:
Middleware điều khiển việc cache response. Nó lưu trữ response và trả về từ cache. Đây là tính năng nằm trong thư viện Microsoft.AspNetCore.ResponseCaching được mặc định có trong ASP.NET Core
Trong Startup.ConfigureServices, thêm Response Caching Middleware vào service collection.
public void ConfigureServices(IServiceCollection services)
{
services.AddResponseCaching();
services.AddRazorPages();
}
ASP.NET Core 3.0 sử dụng System.Text.Json làm thư viện mặc định khi thao tác với JSON. Chúng ta có thể đọc ghi JSON một cách bất đồng bộ. Nó tối ưu tốc độ hơn Newtonsoft.Json. Namespace System.Text.Json cung cấp các tính năng làm việc với JSON như sau:
Giảm số lượng HTTP Request là một trong số các tối ưu chính. Cache trang web và tránh chuyển hướng ở client là cách để giảm số lượng kết nối đến web server.
Sử dụng các kỹ thuật sau để giảm HTTP Request:
Bằng cách giảm HTTP Request sẽ làm trang tải nhanh hơn
Các exception thường ít xảy ra. Throw và catch exception sẽ tốn tương đối thời gian trong code.
Nén response, sẽ giảm kích thước của file để tăng tốc độ. Trong ASP.NET Core có cung cấp middleware hỗ trợ việc này.
Thông thường các response không được nén. Nó thường bao gồm CSS, JavaScript, HTML, XML và JSON.
(source: https://github.com/davidfowl/AspNetCoreDiagnosticScenarios/blob/master/AspNetCoreGuidance.md)
Thư viện: Microsoft.AspNetCore.ResponseCompression được mặc định gắn vào ASP.NET Core
Đoạn code sau sẽ bât tính năng Response Compression Middleware cho các loại file trong MIME mặc định.
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddResponseCompression();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseResponseCompression();
}
}
Có một số provider:
public void ConfigureServices(IServiceCollection services)
{
services.AddResponseCompression(options =>
{
options.Providers.Add<BrotliCompressionProvider>();
options.Providers.Add<GzipCompressionProvider>();
options.Providers.Add<CustomCompressionProvider>();
options.MimeTypes =
ResponseCompressionDefaults.MimeTypes.Concat(
new[] { "image/svg+xml" });
});
}
HttpContext chỉ được truy cập trong vòng đời của HTTP request trong ASP.NET Core. Dưới đây là một số gợi ý khi dùng HttpContext từ tài liệu của Microsoft:
Tối ưu phía client là một khía cạnh quan trọng để tăng hiệu năng. Khi tạo một website sử dụng ASP.NET Core hãy xem một số thủ thuật sau:
Bundling kết hợp nhiều file vào một file duy nhất, giảm số lượng request. Bạn có thể có nhiều bundle trong một trang web.
Minification loại bỏ các ký tự không cần thiết trong code mà không thay đổi tính năng, nó cũng giảm kích thước file. Sau khi áp dụng minification, các tên biến sẽ ngắn hơn thành một ký tự và các comment cũng như khoảng trắng không cần thiết sẽ bị loại bỏ.
Tải các file JavaScript sẽ được đặt xuống cuối. Nếu làm như vậy các nội dung tĩnh sẽ hiển thị nhanh hơn, người dùng sẽ không phải đợi.
Sử dụng một CDN để tải static file như hình ảnh, JS, CSS...Luôn giữ cho các dữ liệu gần nhất với người dùng từ các server gần nhất.
Giờ bạn đã nắm được 10 thủ thuật tăng hiệu năng của ASP.NET Core. Tôi hy vọng bạn có thể dùng nó trong ứng dụng của mình.
Nguồn: tedu.com.vn