概要
using System.Linq; using UnityEngine; public class Example : MonoBehaviour { private static string[] m_list = { "フシギダネ", "フシギソウ", "フシギバナ", }; private void Update() { var name = "ピカチュウ"; var result = m_list.Where( c => c == name ); } }
通常の LINQ をそのまま使用すると
184 B の GC Alloc が発生しますが
using System; using System.Collections.Generic; using UnityEngine; public class Example : MonoBehaviour { private static string[] m_list = { "フシギダネ", "フシギソウ", "フシギバナ", }; private void Update() { var name = "ピカチュウ"; var result = m_list.WhereNotAlloc( ( c, value ) => c == value, name ); } } public static class EnumerableExt { public static IEnumerable<T> WhereNotAlloc<T, TValue> ( this IEnumerable<T> self, Func<T, TValue, bool> predicate, TValue value ) { foreach ( var n in self ) { if ( predicate( n, value ) ) { yield return n; } } } }
上記のように変数キャプチャを回避する拡張メソッドを自作して使用すると
GC Alloc を 96 B に抑えることができます
参考サイト様
https://www.slideshare.net/xin9le/dotnetperformancetips-170268354