読者です 読者をやめる 読者になる 読者になる

javaのlength()とか

String str="abcd";
int j=0,len=str.length();
for(int i=0;i<0xfffffff;i++){
	for(int s=0;s<str.length();s++){
		j++;
	}
}
907ms
String str="abcd";
int j=0,len=str.length();
for(int i=0;i<0xfffffff;i++){
	for(int s=0;s<len;s++){
		j++;
	}
}
1517ms
String str="abcd";
int j=0,len=str.length();
for(int i=0;i<0xfffffff;i++){
	for(int s=0;s<str.length();s++){
		//j++;
	}
}
840ms
String str="abcd";
int j=0,len=str.length();
for(int i=0;i<0xfffffff;i++){
	for(int s=0;s<len;s++){
		//j++;
	}
}
716ms

何がおかしいか

まずループの終了条件毎にlength()呼ばないで、intに前もって入れとけ的な高速化の手法をみるんだけど、1つ目と2つ目を比べると遅いはずの1つ目の方が速い。これは納得がいかなくて、1つ目はなんか最適化されてるのだろうか?

次に、1つ目と2つ目はループ内でjをインクリメントしてるんだけど、なんとなくコメントアウトして実行してみたら、3つ目は順当に時間が減っているとして、4つ目は異様に時間が減っている。
4つ目が減っているというよりは、2つ目が異様に時間がかかっていると考えるのが妥当か。

そもそも

long start,end;
start=System.currentTimeMillis();
		
end=System.currentTimeMillis();
System.out.println((end-start)+"ms");

これで計測したのだけど、これが正確じゃない可能性もある気がするけど、100msレベルでずれるとは思えない。

stringではこうなったけど、listとか他のコレクションだと変わってくるかも?

結論

こういった高速化を当てにするべきではない