Featured image of post Aggressive Inlining

Aggressive Inlining

Thuộc tính Aggressive Inlining có tác dụng gì trong IL2CPP

Giới thiệu

Điều đầu tiên nó là một Method Attribute và được sử dụng thông qua MethodImplOptions.AggressiveInlining

Ví dụ

1
2
3
4
5
6

[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void CalculateDamage()
{
  // TODO
}

Trong C# việc đánh dấu một phương thức là [MethodImpl(MethodImplOptions.AggressiveInlining)] sẽ yêu cầu trình biên dịch JIT (Just-In-Time Compiler) thực hiện nội tuyến (inline) phương thức đó càng nhiều càng tốt.

Các hàm nội tuyến thực thi nhanh hơn các hàm bình thường vì một khi nó được biên dịch trình biên dịch không cần tham chiếu hàm trong thời gian chạy.

Tuy nhiên trong unity khi sử dụng IL2CPP trình biên dịch JIT không được sử dụng. Vì vậy chúng ta cùng tìm hiểu xem.

Giải thích

Theo @JoshPerterson kỹ sư của Unity

Khi IL2CPP tạo mã C++, các method và generic method trong các class generic được đặt trong các file có tên là GenericMethod??.cpp và Generics??.cpp tương ứng. Trong đó ?? đại diện cho một số tùy ý, IL2CPP sẽ tạo ra nhiều file với các số khác nhau. Các phương thức không phải là generic được đặt trong các file dựa trên tên assembly, ví dụ: Assembly-CSharp??.cpp Theo mặc định, trình biên dịch C++ không thể gọi phương thức nội tuyến giữa hai tệp cpp. Trong IL2CPP, các phương thức có [MethodImpl(MethodImplOptions.AggressiveInlining)] được sao chép trong mỗi tệp cpp nơi phương thức được sử dụng. Điều này sẽ cho phép trình biên dịch C++ nội tuyến phương thức.

Khi biên dịch với cài đặt build được đặt thành “Master” (C++ Compiler Configuration) trong bản build dành cho Windows Standalone “link time optimization” được bật . Điều này cho phép trình biên dịch C++ trì hoãn các quyết định nội tuyến cho đến khi bước linker chạy. Trình linker sẽ biết toàn bộ chương trình và có thể tối ưu hóa trên nhiều tệp cpp. Vì vậy, nói chung nên sử dụng cài đặt “Master” để có được hiệu suất tốt nhất trong thời gian chạy.

Sau khi đọc giải thích này nó dường như có nhiều tác dụng hơn bình thường. Cụ thể nó sẽ rất hữu ích khi đính kèm nó vào các public method được gọi từ một assembly khác hay được gọi từ một generic method.

Và dường như tùy chọn C++ Compiler Configuration được đặt thành master sẽ khiến nó nhanh hơn.

IL2CPP dường như không chỉ hỗ trợ AggressiveInlining mà còn hỗ trợ MethodImplOptions.NoInliningMethodImplOptions.NoOptimization. Trong các bản dựng Windows, NoInlining được chuyển thành __declspec(noinline) và NoOptimization được chuyển thành __pragma(optimize(“”, off)). Điều này dường như không được sử dụng rất thường xuyên.

AggressiveInlining dường như không có tác dụng xấu nào cả vì vậy hãy tích cực sử dụng nó nếu có thể

yenmoc
Lượt nghé thăm