タプルの分解の最適化

タプル構築と同時に分解(要するに多値代入というか)する場合は、タプルを作らない最適化かけたいって。

要するに、例えば以下みたいな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;

これ、実のところこの時点でタプルの特別扱いが掛かってます。 分解の仕様上は、以下のようなコードになるべきところを、タプルでまでそれをやるのは無駄だってことで、Item1Item2の直参照に。

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の問題でもあるものの、MoveNextCurrentにメソッドが分かれてると、スレッド安全に作りようがなくて困る。 IAsyncEnumerableも同じような構造で作られると、async streamをチャネル的に(Go言語のgoroutine/channelみたいに)使いにくい/使えないので、スレッド安全にできる実装を考えてほしいとのこと。