タプルの分解の最適化
タプル構築と同時に分解(要するに多値代入というか)する場合は、タプルを作らない最適化かけたいって。
要するに、例えば以下みたいなswapコード書いたとして、
var x = 1;
var y = 2;
(x, y) = (y, x);
今だとこうなる。
var x = 1;
var y = 2;
var v = new ValueTuple<int, int>(x, y);
x = v.Item1;
y = v.Item2;
これ、実のところこの時点でタプルの特別扱いが掛かってます。
分解の仕様上は、以下のようなコードになるべきところを、タプルでまでそれをやるのは無駄だってことで、Item1
、Item2
の直参照に。
var x = 1;
var y = 2;
var v = new ValueTuple<int, int>(x, y);
v.Deconstruct(out x, out y);
Deconstruct
を最適化で消すんだったら、new ValueTuple
の方も消していいんじゃない?という感じ。
なのでたぶん、以下のような感じのコードに展開されるのではないかと。
ほぼ、普通のswapコードに。
var x = 1;
var y = 2;
var tempX = x;
var tempY = y;
x = tempY;
y = tempX;
Recap of async streams
Lucian (C#チーム非同期担当の開発者)が夏休みから帰ってきて、現状のまとめを投稿。
まあ、本当にまとめのみ。基本、過去にブログで取り上げた内容なので詳細割愛。
あと、Stephen (.NETチーム内の人。活動を見るに.NETのパフォーマンス改善系の作業をしてるっぽい)がパフォーマンスがらみの懸念を投稿。
現状のIEnumerable
の問題でもあるものの、MoveNext
とCurrent
にメソッドが分かれてると、スレッド安全に作りようがなくて困る。
IAsyncEnumerable
も同じような構造で作られると、async streamをチャネル的に(Go言語のgoroutine/channelみたいに)使いにくい/使えないので、スレッド安全にできる実装を考えてほしいとのこと。