Hello everyone,
Decided to start this thread to write some scripting optimization tips. Hopefully someone will find this useful.
Results:
Calculating Distance
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public static class ExtensionsManager {
public static float Distance (Vector3 a, Vector3 b)
{
Vector3 vector;
float distanceSquared;
vector.x = a.x - b.x;
vector.y = a.y - b.y;
vector.z = a.z - b.z;
distanceSquared = vector.x * vector.x + vector.y * vector.y + vector.z * vector.z;
return (float)System.Math.Sqrt(distanceSquared);
}
}
public class DistancePerformanceTest : MonoBehaviour {
Vector3 v1 = new Vector3 ( 15, 20, 52 );
Vector3 v2 = new Vector3 (-100, 10, 80);
// Update is called once per frame
void Update () {
UnityEngine.Profiling.Profiler.BeginSample("Test 1");
Test1();
UnityEngine.Profiling.Profiler.EndSample();
UnityEngine.Profiling.Profiler.BeginSample("Test 2");
Test2();
UnityEngine.Profiling.Profiler.EndSample();
UnityEngine.Profiling.Profiler.BeginSample("Test 3");
Test3();
UnityEngine.Profiling.Profiler.EndSample();
}
void Test1 ()
{
for (int i = 0; i < 100000; i++)
{
float distance = Vector3.Distance(v1, v2);
}
}
void Test2 ()
{
for (int i = 0; i < 100000; i++)
{
float distance = ExtensionsManager.Distance(v1, v2);
}
}
void Test3 ()
{
for (int i = 0; i < 100000; i++)
{
float distance = Vector3.SqrMagnitude(v2 - v1);
}
}
}
Result
(Times ms)
Test1: 10.75
Test2: 5.51
Test3: 8.20
Mathf abs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MathfPerformance : MonoBehaviour {
// Update is called once per frame
void Update()
{
UnityEngine.Profiling.Profiler.BeginSample("Test 1");
Test1();
UnityEngine.Profiling.Profiler.EndSample();
UnityEngine.Profiling.Profiler.BeginSample("Test 2");
Test2();
UnityEngine.Profiling.Profiler.EndSample();
}
void Test1 ()
{
for (int i = 0; i < 10000; i++)
{
float value = Mathf.Abs(-10.5f);
}
}
void Test2 ()
{
for (int i = 0; i < 10000; i++)
{
float value = System.Math.Abs(-10.5f);
}
}
}
Result
(Times ms)
Test1: 0.76
Test2: 0.40
Quaternion Euler
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class QuaternionPerformance : MonoBehaviour {
// Update is called once per frame
void Update()
{
UnityEngine.Profiling.Profiler.BeginSample("Test 1");
Test1();
UnityEngine.Profiling.Profiler.EndSample();
UnityEngine.Profiling.Profiler.BeginSample("Test 2");
Test2();
UnityEngine.Profiling.Profiler.EndSample();
}
void Test1 ()
{
for (int i = 0; i < 10000; i++)
{
Quaternion rot = Quaternion.Euler(new Vector3(1, 6, 3));
}
}
void Test2 ()
{
for (int i = 0; i < 10000; i++)
{
Vector3 v;
v.x = 1;
v.y = 6;
v.z = 3;
Quaternion rot = Quaternion.Euler(v);
}
}
}
Result
(Times ms)
Test1: 2.93
Test2: 1.89
Comparing Tags
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TagsPerformance : MonoBehaviour {
bool yes = false;
// Update is called once per frame
void Update()
{
UnityEngine.Profiling.Profiler.BeginSample("Test 1");
Test1();
UnityEngine.Profiling.Profiler.EndSample();
UnityEngine.Profiling.Profiler.BeginSample("Test 2");
Test2();
UnityEngine.Profiling.Profiler.EndSample();
}
void Test1 ()
{
for (int i = 0; i < 10000; i++)
{
if (gameObject.CompareTag("Player"))
{
yes = true;
}
}
}
void Test2 ()
{
for (int i = 0; i < 10000; i++)
{
if (gameObject.tag == "Player")
{
yes = true;
}
}
}
}
Result
(Times ms)
Test1: 2.44
Test2: 3.54
(GC Alloc)
Test1: 0
Test2: 410.2 KB
Change Position
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ChangePosition : MonoBehaviour {
// Update is called once per frame
void Update()
{
UnityEngine.Profiling.Profiler.BeginSample("Test 1");
Test1();
UnityEngine.Profiling.Profiler.EndSample();
UnityEngine.Profiling.Profiler.BeginSample("Test 2");
Test2();
UnityEngine.Profiling.Profiler.EndSample();
}
void Test1 ()
{
for (int i = 0; i < 10000; i++)
{
Vector3 b = new Vector3(1, 2, 3);
}
}
void Test2 ()
{
for (int i = 0; i < 10000; i++)
{
Vector3 a;
a.x = 1;
a.y = 2;
a.z = 3;
}
}
}
Result
(Times ms)
Test1: 0.24
Test2: 0.13