Cross-Platform Performance - Phần 1
Có rất nhiều kỹ thuật để tăng hiệu suất của các ứng dụng được xây dựng với nền tảng Xamarin. Nói chung các kỹ thuật này có thể giảm đáng kể lượng công việc đang được thực hiện bởi một CPU, và lượng bộ nhớ tiêu thụ bởi một ứng dụng. Bài viết này mô tả và thảo luận về các kỹ thuật này. Hiệu năng ...
Có rất nhiều kỹ thuật để tăng hiệu suất của các ứng dụng được xây dựng với nền tảng Xamarin. Nói chung các kỹ thuật này có thể giảm đáng kể lượng công việc đang được thực hiện bởi một CPU, và lượng bộ nhớ tiêu thụ bởi một ứng dụng. Bài viết này mô tả và thảo luận về các kỹ thuật này.
Hiệu năng ứng dụng kém thể hiện qua nhiều cách. Nó có thể làm cho một ứng dụng treo không phản hồi, có thể làm scroll chậm, và có thể tốn pin. Tuy nhiên, tối ưu performance liên quan đến nhiều hơn là chỉ cần thực hiện 1 đoạn code. Trải nghiệm người dùng về hiệu suất cũng phải được xem xét. Ví dụ: đảm bảo hoạt động được thực hiện mà không cản trở người dùng thực hiện các hoạt động khác có thể giúp cải thiện trải nghiệm của người dùng.
Có một số kỹ thuật để tăng performance cho các ứng dụng được xây dựng với nền tảng Xamarin:
- Sử dụng Profiler: Khi phát triển một ứng dụng, điều quan trọng là cố gắng để tối ưu hóa code khi nó đã hình thành. Profiling là một kỹ thuật để xác định những nơi cần tối ưu hóa code để có hiệu quả cao nhất trong việc giảm các vấn đề về hiệu năng. Trình Profiler theo dõi việc sử dụng bộ nhớ của ứng dụng và ghi lại thời gian chạy các phương thức trong ứng dụng. Dữ liệu này giúp điều hướng thông qua các đường dẫn thực hiện của ứng dụng và chi phí thực hiện của mã để có thể khám phá ra cơ hội tối ưu hóa tốt nhất.
Xamarin Profiler sẽ đánh giá, và giúp tìm các vấn đề liên quan đến hiệu suất trong một ứng dụng. Nó có thể được sử dụng để cấu hình các ứng dụng Xamarin.iOS và Xamarin.Android từ bên trong Visual Studio cho Mac hoặc Visual Studio.
Những cách làm đưới đây được khuyến cáo khi Profiling 1 ứng dụng
- Tránh profiling một ứng dụng trên máy ảo giả lập có thể bóp méo hiệu suất ứng dụng.
- Lý tưởng nhất cho việc tạo Profiler là thực hiện trên nhiều loại thiết bị khác nhau, vì việc thực hiện các phép đo hiệu suất trên một thiết bị sẽ không phải lúc nào cũng hiển thị các đặc tính hiệu năng của các thiết bị khác. Tuy nhiên, tối thiể profiling phải được thực hiện trên một thiết bị có cấu hình thấp.
- Đóng tất cả các ứng dụng khác để đảm bảo rằng toàn bộ tác động của ứng dụng muốn tracking, chứ không phải là các ứng dụng khác.
- Giải phóng tài nguyên IDisposable: IDisposable interface cung cấp một cơ chế giải phóng tài nguyên. Nó cung cấp một phương pháp Dispose được thực hiện để giải phóng tài nguyên. IDisposable không phải là destructor, và chỉ nên thực hiện trong các trường hợp sau:
Khi class sở hữu các tài nguyên không được quản lý. Các tài nguyên không được quản lý điển hình cần được giải phóng bao gồm file, stream và internet connection. Khi lớp sở hữu tài nguyên IDisposable quản lý. Có thể gọi các IDisposable.Dispose thực hiện giải phóng tài nguyên khi không còn cần thiết. Có hai cách tiếp cận để đạt được điều này:
Bằng cách wrap đối tượng IDisposable trong một câu lệnh using. Bằng cách call đến IDisposable.Dispose trong một try / finally block.
-
Unsubscribe sự kiện Để ngăn chặn leak memory, các sự kiện nên được Unsubscribe trước khi Object quản lý được giải phóng. Ví dụ dưới đây cho biết cách Unsubscribe một sự kiện:
-
Delay việc khởi tạo các object mới Lazy initial có thể được sử dụng để delay việc tạo ra một object cho đến khi nó được sử dụng lần đầu. Kỹ thuật này chủ yếu được sử dụng để cải thiện hiệu suất, tránh tính toán, và giảm yêu cầu bộ nhớ. Hãy xem xét sử dụng Lazy initial trong hai kịch bản này:
- Ứng dụng có thể không sử dụng đối tượng.
- Các hoạt động tốn kém khác phải hoàn thành trước khi đối tượng được tạo ra. Lớp Lazy <T> được sử dụng để xác định một kiểu Lazy initial, như ví dụ sau đây:
5.Thực hiện các hoạt động Bất đồng bộ .NET cung cấp các phiên bản bất đồng bộ của nhiều API của nó. Không giống như các API đồng bộ, các API không đồng bộ đảm bảo rằng thực hiện hoạt động không bao giờ chặn thread gọi trong 1 thời gian đáng kể. Do đó, khi gọi API từ UI thread, sử dụng API không đồng bộ nếu có. Thao tác này sẽ giúp thread UI không bị chặn, sẽ giúp nâng cao trải nghiệm của người dùng với ứng dụng.
Ngoài ra, các task long time nên được thực hiện ở background, để tránh chặn thread UI. .NET cung cấp async và await là các syntax cho phép viết mã asynchronous thực thi các thao tác vụ long time trên background, và truy cập kết quả khi hoàn thành. Tuy nhiên, trong khi hoạt động lâu dài có thể được thực hiện bất đồng bộ với từ khóa await, điều này không đảm bảo rằng các hoạt động sẽ chạy ở background. Thay vào đó, điều này có thể được thực hiện bằng cách chuyển các hoạt động lâu dài sang Task.Run, như ví dụ sau đây: Phương thức RecognizeFace thực thi ở background, với phương thức RecognizeFaceButtonClick đợi cho đến khi phương thức RecognizeFace hoàn thành trước khi tiếp tục. Các task long time cũng nên hỗ trợ khả năng cancel. Ví dụ, tiếp tục một hoạt động long time có thể trở nên không cần thiết nếu người dùng điều hướng trong ứng dụng. Mẫu thực hiện hủy bỏ như sau: Tạo một CancellationTokenSource. Token này sẽ quản lý và gửi thông báo hủy. Truyền giá trị thuộc tính CancellationTokenSource.Token cho mỗi tác vụ có thể hủy bỏ được. Gọi phương thức CancellationTokenSource.Cancel để cung cấp thông báo hủy.