より良いエンジニアを目指して

1日1つ。良くなる!上手くなる!

メモリ割り当てについて深く考える〜JetBrains .NET Night Tokyo 2018@LifeBearの資料を読んで(1)

lifebear.connpass.com

この勉強会に参加したかったのですが、抽選から漏れてしまったので、キャンセルして別の用を入れたのですが、気づいたら空きがあったという。

参加できず、残念だったのですが、資料を公開してくださいました。

素晴らしい。

英語ですし、基盤技術なので地味だし、難しいです。

素晴らしい発表を聞いたとしても、それを理解して実践しなければもったいない。

かなり時間をかけて資料を読みました。

でないと、発表したMaarten Balliauwはベルギー人でやっぱりビールが好きな人なんだろうなー程度でさらっと読み流してしまうので。

メモリ管理とガーベジコレクション

扱っている題材としては、.NETにおけるメモリ管理とGCガーベジコレクション)です。

記事を読んだ後に、GCの存在というのは、プログラミングを楽にしてくれる縁の下の力持ちではあるなと。

C++やCをやっているとわかりますが、メモリ確保と解放は、煩雑です。

私自身、これを考えずに済むという理由でC++からC#をやるようになったのでした。

おかげで開発効率は上がると。

逆を言うならば、こうしたことについて10年以上考えずにいたのでした。

メモリ割り当てについて

メモリ割り当ては、気づかないうちに起きているという。

  • ボクシング
  • 配列パラメータ
  • ラムダ

それを気づく方法の一つが、Resharper Heap Allocation Viewer Pluginを入れる方法とのこと。

Resharper Ultimateを持っていたのですが、Resharper Ultimate Extensionは全く使ってませんでした。

f:id:rimever:20181204215714p:plain

では、早速、Heap Allocation Viewerをインストールすることにします。

f:id:rimever:20181204222342p:plain

newのようなメモリ割り当てが行われている部分に下線で明示されるようです。

GroupByは割り当てが発生するけど、Anyは発生しないと。

といっても、何かしらの処理をするのにメモリは必要となるので、無駄遣いが悪いのであって遣うことは避けられないと。

不要なメモリ割り当てを防ぐ方法

無駄なメモリ割り当てを防ぐ方法が、Object Pool パターンというデザインパターン

すでに、オブジェクトが存在し、使われていないオブジェクトがあるのであれば、それにパラメーターを再度割り当てて使い回そうというもの。

これについてはdot Memoryの下記のドキュメントで知ってはいました。

www.jetbrains.com

が、言っていることはわかるけど、下手に使い回すと変な値が残ったままとなってバグの温床にならないかなーという気配もしてました。

ただ、改めて勉強してみると、身近なところでこの仕組みがあることに気づきました。

それがデータベースのコネクションプールです。

thinkit.co.jp

ただ、メモリやガーベジコレクションによる負荷だけでなく、データベースへのアクセスには接続の時間がかかるので、生成によるコストも抑えられる。

なるほどな、と。

ASP.NET Coreでは、そのためのArrayPoolという機構も用意されているとのこと。

adamsitnik.com

この記事もなかなか読み応えがあります。

勉強することがどんどん出てきます。