メモリを意識したコーディングしてますか?

こんにちは、GEEXの小池です。
突然ですが、皆さんは普段メモリを意識したコーディングをしていますか?
C#やJavaだと自動的にガベージコレクションが働いてくれるので、コーディングする際にメモリを意識することはなくなってきたかもしれないです。

メモリを意識するとはどういうこと?ということで、C#のstringとStringBuilderを例に説明していきます。

【string】

string[] wordList = { "あ", "い", "う", "え", "お" };

string text = "";

for (int i = 0; i < 5; i++)
{
    text += wordList[i];
}

Console.Write(text);

【StringBuilder】

string[] wordList = { "あ", "い", "う", "え", "お" };

StringBuilder sb = new StringBuilder();

for (int i = 0; i < 5; i++)
{
    sb.Append(wordList[i]);
}

Console.Write(sb.ToString());

上記、実行すると同じ結果(あいうえお)が返ってきます。ただ、メモリ上で行われている処理に少し違いがあります。

stringはループのたびに新しくインスタンスを生成します。なので、インスタンスを何回も生成しているので負荷が高くなります。(参照しなくなったインスタンスはガベージコレクションの対象となります。)ざっくりですが、以下のようなイメージです。

★イメージ★


逆に、StringBuilderは、ひとつのインスタンスの値を更新していきます。

★イメージ★

なぜ違う動きになるのかというと、stringが「不変オブジェクト」のためです。不変オブジェクトというのは、一度データを入れると2度と書き換えられないオブジェクトのことです。書き換えられないので、安全性は確保されるのですが文字連結などの操作があった場合、新しいインスタンスを生成する為上記のような動きをします。今回の例では5回しかループしないのでメモリ負荷に大きな差は出ませんが、ループ回数が多くなれば負荷に差が出てきます。

このように、普段のコーディングの中でちょっとメモリを意識すると負荷が減ったり、メモリにこうやってセットされるからこうしないと~など考えてみると、ちょっと楽しくなりますね♪
基本会社について書くことが多い私ですが、たまに技術的なお話を書いていこうと思うのでこれからもよろしくお願いします!