- PR -

static修飾子は多用するべきか

投稿者投稿内容
Anthyhime
ぬし
会議室デビュー日: 2002/09/10
投稿数: 437
投稿日時: 2005-12-16 14:50
staticフィールドは速いよ。
Jun
大ベテラン
会議室デビュー日: 2003/08/25
投稿数: 141
投稿日時: 2005-12-16 17:40
引用:

staticフィールドは速いよ。



それで思い出したのですが,staticに関してもうひとつ疑問があります
ローカルなスタティックを使うことで通常再入可能では無いが(javaにはfinalは
あっても定数は無いのでおそらく)高速なメソッドを作れますよね
必ずしもメソッドがスレッドセーフであることが要求されないことを考えると
ローカルなスタティック変数ってあってもよさそうだけど,実際無いのは
何故かなって思うんですが(もしかしてあるのかも知れないが確かエラーになったような
気がします)
Anthyhime
ぬし
会議室デビュー日: 2002/09/10
投稿数: 437
投稿日時: 2005-12-16 18:02
CGが発生するとVM内で動的にアドレスが変わってしまうので、ローカル変数へのポインタを固定するのが難しいからではないでしょうかね。
mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 2005-12-16 18:52
>定義するクラス:固定名のファイルの内容を取得して保持しておき、要求に応じて情報を提供するクラス
>呼び出し元:同時進行が予想される複数のスレッド(スレッド数不定)
まさに皆さんおっしゃっている、シングルトンで良いんじゃないんでしょうか。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2005-12-16 18:53
引用:

staticフィールドは速いよ。


JDK1.1の頃の話でしょうか。
テストしてみましたが、インスタンスのフィールドアクセスと
クラスのフィールドアクセスの速度に殆ど差がありません。(JDK5.0)

現在のJVMでは最適化が行われていますし、
小手先の技ではむしろ最適化の邪魔になるケースもあるそうです。

検証コード(汚いですが・・・)
コード:
public class Test {

	public static String classField = "classField";
	
	public String instanceField = "instanceField";
	
	public static int cCount = 0;
	
	public static int iCount = 0;
	
	public static void test(int n) {
		String variable;
		Test test = new Test();
		variable = Test.classField;
		long l1,l2,l3;
		
		l1 = System.currentTimeMillis();
		for(int i = 0; i < 50000000; i++){
			variable = Test.classField;
		}
		l2 = System.currentTimeMillis();
		for(int i = 0; i < 50000000; i++){
			variable = test.instanceField;
		}
		l3 = System.currentTimeMillis();
		
		System.out.println(n + ":l2 - l1 = " + (l2 - l1));
		System.out.println(n + ":l3 - l2 = " + (l3 - l2));
		if((l2 - l1) > (l3 - l2)){
			cCount++;
		}else if((l2 - l1) < (l3 - l2)){
			iCount++;
		}
	}

	public static void main(String[] args) {
		for(int i = 0; i < 100; i++){
			test(i);
		}
		System.out.println("cCount=" + cCount + ":iCount=" + iCount);
	}
}

未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2005-12-17 00:28
引用:
小手先の技ではむしろ最適化の邪魔になるケースもあるそうです。


そういえば、このまえ StringBuffer よりも String を使用したほうが速いという話をどこかで聞きました。従来、String よりも StringBuffer のほうが高速である、というのが定説でした。ところが、J2SE 5.0 の最適化では String は StringBuilder と同等のコードに置き換えられるため、同期不要な分だけ StringBuffer よりも速くなる可能性があるということでした。StringBuilder のインスタンス生成コストがあるので常に StringBuffer より速くなるわけではありませんが、速くなることもあると。

気にせずに String の連結をしまくってきた私は勝ち組ですね。
さいくろう
大ベテラン
会議室デビュー日: 2005/11/19
投稿数: 170
お住まい・勤務地: 川崎市
投稿日時: 2005-12-17 00:41
速度だのメモリの節約だの、仕様書に規定があるの?
実装の結果、ぶっちゃけ偶然の産物じゃないのかよ。

staticの多態性にしたって、
それを可能にすることによって、オブジェクト指向に
どんな貢献や混乱をもたらすか、全く触れられてない。
少なくとも、Jun氏はSingletonのなんたるかを理解してはいらっしゃらなさそうだ。

[ メッセージ編集済み 編集者: さいくろう 編集日時 2005-12-17 02:14 ]
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2005-12-17 02:22
staticは概念にもとづいて使うべきでしょ?
概念的に合っているなら使えばいいし、合ってないなら使っちゃだめ。

スキルアップ/キャリアアップ(JOB@IT)