しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

ASP.NET Web Pages 3.2.1 のベータ版がリリースされました

最近は ASP.NET MVC 5.2 / Web API 2.2 / Web Pages 3.2 がリリースされました - しばやん雑記 でも書いたように Web Pages の更新がほぼ無いので、このまま vNext に進むのかと思っていたら 3.2.1 のベータで久しぶりに大きなアップデートが行われたみたいです。

知ったきっかけは中の人のツイートです。

そして ASP.NET 公式サイトに投稿された情報が以下の URL にあります。

What's New in ASP.NET Web Pages 3.2.1 Beta | The ASP.NET Site

要約すると Razor で大規模なコンテンツをレンダリングする時に LOH を圧迫していたのを、MSN チームと連携して改善したという話のようです。内容としては Gen 2 GC が大幅に削減されたことで、GC による停止時間が少なくなり、パフォーマンスが改善されたという流れですね。

Razor が LOH を沢山使う問題に関しては 2 年前から指摘されていたようです。

ASP.NET MVC / Web API / Web Pages - View Issue #585: Large responses end up on LOH when using Razor engine

この時は .NET 4.5 で GC 周り改善されるということで一旦閉じられたようですが、今月になって根本的な対応が CodePlex にコミットされました。

https://aspnetwebstack.codeplex.com/SourceControl/changeset/3fe0d348f00864e4f1eeaefbd027ea965787b892

コードを見てみると、今まではレンダリング結果が入っている TextWriter を ToString して中身を取り出していたようですが、コンテンツ次第では 85000 バイトを軽々超えてしまうことも考えられますね。そこで、今回は StringWriter の拡張メソッドとして CopyTo を追加し、内部では 1KB ごとに出力先の TextWriter へ書きこむように変更したようです。*1

とりあえず、実際に動いているサービスに 3.2.1-beta を入れてマルチバイト周りなどで問題が無いか見ていますが、今のところ特に問題なく使えています。

*1:char[1024] って 1KB ではない気もするけど