Linq で、オペレータのオブジェクトは全部クラスなわけで、Unity でフレーム内で使用するにはGC的にヤダなぁ、というのがあると思うんです(速度的な面はいいとして)
オペレータってのは遅延実行できて、使いまわすことができるのですが、
そうすると列挙ソースだけ変更したいなっていう要望が発生すると思います。
(もしくはもっといいやり方があるかもしれませんが)
そういう場合のために、ソースを差し替えできるようなクラスを作成してみました。
https://github.com/abarabone/EnumerableCache/blob/master/ConsoleApp1/EnumerableCache.cs?ts=4
絶賛試行錯誤中なんですが。
つうてもまぁ、なんか微妙なかんじです。
一番微妙なのが、struct enumerator ですよね。
Linq オペレータって、内部で foreach() yield return やってるじゃないですか。
そこで生成される enumerator は、class enumerator になりますよね?
んじゃあ結局、毎フレーム列挙する度にオペレータの深さだけGCゴミがたまっていくのは変わらないということなんじゃないかと。
まだ実際に Unity で試してないのであれなんですけど
(テストとかデバッグとかの機能をよく知らないので二の足を踏んでしまいます…)
ところで
Linq のオペレータとかイテレータのシグネチャ?を、
static IEnumerable<TResult> SelectIterator<TSource, TResult>
(IEnumerable<TSource> source, Func<TSource, int, TResult> selector)
から
static IEnumerable<TResult> SelectIterator<TSource, TResult, TEnumerable>
(TEnumerable source, Func<TSource, int, TResult> selector)
where TEnumerable : IEnumerable<TSource>
みたいな感じに変えれば、内部の foreach() で専用の GetEnumerator() を呼ぶ感じになったりしますかね?
(あ、無意味…だって専用の struct enumerator を書かないとだめだし、そうすると foreach() yield return が使用できなくなって、選択的に struct enumerator を呼ぶことができなくなる…よね?)
selector ラムダとかはどうなんだろ、キャッシュされると思うんですけど。
あ、いや、Linq のソース全書き換えとかはさすがにやらないですが…
2018年12月9日日曜日
登録:
コメントの投稿 (Atom)
ニューラルネットやってみてる
最近ニューラルネットやってみてる 理屈を学ぼうと思って、まずはオブジェクト的に作ってみてる (ベクトル化とかは後回しで) sigmoid, tanh, ReLU MSE, cross entorpy あたりを小規模にいじってみてます でも今 soft max の逆伝...
-
VBAでラムダのようなものを使いたくて試行錯誤中 まずは引数として渡せる関数の再現 試行錯誤の履歴 ・Application.Run() … 名前文字列で指定する 重め 参照引数が使えない Appli...
-
Linq で、オペレータのオブジェクトは全部クラスなわけで、Unity でフレーム内で使用するにはGC的にヤダなぁ、というのがあると思うんです(速度的な面はいいとして) オペレータってのは遅延実行できて、使いまわすことができるのですが、 そうすると列挙ソースだけ変更したいな...
-
async/await await XxxxAsync(); と記述した時、XxxxAsync() が終了するまで制御をOSに返し、 それ以降の実行を待機する仕組み async 関数を await で実行 void を返す ... fire ...
0 件のコメント:
コメントを投稿