The Speed (fast to slow):
cached _transform >> Component.transform >> Component.GetComponent<Transform>
And If you disassemble a UnityEngine.dll C# binary, you can see transform do not call GetComponent (Component class member), just call internal mono runtime method. Here is the transform code.
// UnityEngine.Component
public Transform transform
{
get
{
return this.InternalGetTransform();
}
}
[WrapperlessIcall]
[MethodImpl(MethodImplOptions.InternalCall)]
internal extern Transform InternalGetTransform();
And Here is disassembled Component class's GetComponent Method.
public extern Component GetComponent(Type type);
public T GetComponent<T>() where T : Component
{
return this.GetComponent(typeof(T)) as T;
}
[WrapperlessIcall]
[MethodImpl(MethodImplOptions.InternalCall)]
public extern Component[] GetComponents(Type type);
GetComponent is a kind of Finding function using generics. So it's a little bit slower than caching.
Original Source :
public class Test : MonoBehaviour
{
Transform _transform;
void Start()
{
_transform = this.transform;
_transform = gameObject.GetComponent<Transform>();
}
}
Binary Disassembled:
public class Test : MonoBehaviour
{
private Transform _transform;
private void Start()
{
// == UnityEngine.Component::get_transform()
this._transform = base.get_transform();
// == UnityEngine.Component::GetComponent<UnityEngine.Transform>()
this._transform = base.get_gameObject().GetComponent<Transform>();
}
}