Post Page Advertisement [Top]



オブジェクトをの管理はコンピューターメモリーの効率的な利用と深く関りがあります。

ですので、余計ななオブジェクトを作らないことが大事です。

String s = new String("Don't do like this");
String s = "Good";

上のStringはStringオブジェクトを作成するため文字列、
つまりStringを利用しております。


オブジェクトを作るために、オブジェクトを利用しておるので、
メモリーの無駄が出来ます。

forやwhileのようなループでこいう作り方をされると、何百何千のオブジェクトが作成されるか分かりません。


このため、Stringのオブジェクト作成は下のような方法がよい方法です。

Boolean bool = new Boolean("true");
Boolean bool2 = Boolean.valueOf("true");


Booleanも同じです。
コンストラクタを使わない方法があれば、
そちらを使って頂く法が効率的な方法になります。

もし、Classの中にスタティックファクトリメソッドがあれば、
それを使うのもいい方法です。


import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

public class Person {
    private final Date birthDate;

    public boolean isBabyBoomer(){
        Calendar gmtCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
        gmtCal.set(1946, Calendar.JANUARY, 1, 0, 0, 0);
        Date boomStart = gmtCal.getTime();
        gmtCal.set(1965, Calendar.JANUARY, 1, 0, 0, 0);
        Date boomEnd = gmtCal.getTime();
        return birthDate.compareTo(boomStart) >= 0
                && birthDate.compareTo(boomEnd) < 0;
    }
}



ベビーブームの時代に生まれた人であれば

trueを返して、そうでない人はfalseを返すクラスです。

このコードでは、ベビーブームの時代というメソッドは、
このクラスが呼び出されるたびに実行されます。

Calendarオブジェクト一つ、TimeZoneオブジェクト一つ、
Dateオブジェクトの2つが無駄に作られてしまいます。

このようなコードは、staticメソッド作成によって効率化が可能になります。

import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

public class Person {
    private final Date birthDate;
    
    private static final Date BOOM_START;
    private static final Date BOOM_END;

    static {
        Calendar gmtCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
        gmtCal.set(1946, Calendar.JANUARY, 1, 0, 0, 0);
        BOOM_START = gmtCal.getTime();
        gmtCal.set(1965, Calendar.JANUARY, 1, 0, 0, 0);
        BOOM_END = gmtCal.getTime();
    }

    public boolean isBabyBoomer() {
        return birthDate.compareTo(BOOM_START) >= 0 && birthDate.compareTo(BOOM_END) < 0;
    }
}


効率化を図るため、このような形でして頂けると
一度呼び出されオブジェクトを生成した後、
再び呼び出されても既存のオブジェクトを使うようになります。

Personクラスが頻繁に呼び出されるクラスであるほど、
使用するメモリーの違いは大きく差が出ます。


このほかに、JDK 1.5バージョンから
不要なオブジェクトを生成する方法がもう一つ増えました。

Javaの基本型と、それに対応する参照型を
混ぜて使うことができるようになったためです。


まず、下段の画像を見てください。




Javaで使用するデータタイプです。

プリミティブ型(primitive)は、それに対応する参照型があります


Byte, Short, Integerなどがその例になります。

int i = 1; // primitive type
Integer i2 = new Integer(2); // reference type



この二つの違いがあります。

まずプリミティブ型はその変数にデータのみ持つが、

参照型はアデータ以外にもその変数のイデンティティも持ちます。




空間の効率的な部分で基本データ型がより効率的です。

バージョン1.5以降、これらのプリミティブ型(基本型)と
参照型を混ぜて使うことが可能になりました。

この機能を自動オブジェクト化(autoboxing)と呼ぶます。


例えば

Long sum = 0L;
for(long i = 0; i < Integer.MAX_VALUE; i++){ // 2147483647
    sum += i;
}



このコードは、計算性能が非常に悪いです。

long(基本型)に書かれるはずの処にLong(参照型)に書かれたためです。


おかげでsumのデータが変わる度に、Longオブジェクトが作成され

挙句の果てには2147483647つのLongオブジェクトが生成さることになります。


このコードは、Long sumをlong sumに直せば、性能は格段に上がります。

オブゼダートを作る時この二つを考えて作成すれば性能の高めることができます。




댓글 없음:

댓글 쓰기

Bottom Ad [Post Page]

| Designed by Colorlib