文字列操作の速度を測ってみた(やっつけ2)について、もう少し突っ込んで調べました。
今度は、Java VMオプションを「-server -XX:+PrintCompilation」にして、Java 1.4.2、5.0、6、7のそれぞれで実行してみました。すると、Java 5.0と6との間で出力内容に大きな変化が見られました。
Java SE 5.0の場合
1 java.io.Win32FileSystem::normalize (143 bytes) 2 ! java.net.URLEncoder::encode (378 bytes) 3 java.lang.Character::isLetter (158 bytes) 4 sun.nio.cs.UTF_8$Encoder::encodeArrayLoop (490 bytes) 5 java.nio.Buffer::(68 bytes) 6 ! java.nio.charset.CharsetEncoder::encode (285 bytes) 7* java.lang.System::arraycopy (0 bytes) 8 java.nio.Buffer::position (43 bytes) 9 java.nio.Buffer::limit (62 bytes) 10 ! java.lang.StringCoding::encode (127 bytes) 11 sun.nio.cs.UTF_8$Encoder::encodeLoop (28 bytes) 12 ! java.io.CharArrayWriter::toCharArray (37 bytes) 13 java.lang.AbstractStringBuilder::expandCapacity (51 bytes) 14 s java.lang.StringBuffer::toString (17 bytes) 15 java.lang.AbstractStringBuilder:: (12 bytes) 16 java.nio.charset.Charset::forName (20 bytes) 17 java.io.CharArrayWriter:: (7 bytes) 1% b.A::measure @ 14 (47 bytes) 18 b.A::measure (47 bytes) //この行以降が2回目のmeasureメソッド呼出し後 2% b.A::measure @ 14 (47 bytes)
Java SE 6の場合
195 1 java.lang.String::charAt (33 bytes) 196 2 java.lang.AbstractStringBuilder::append (40 bytes) 229 3 s java.lang.StringBuffer::append (8 bytes) 231 4 java.lang.CharacterDataLatin1::getProperties (11 bytes) 232 5 ! java.net.URLEncoder::encode (375 bytes) 234 6 java.lang.Character::forDigit (42 bytes) 234 7 java.lang.Character::isLetter (5 bytes) 235 8 java.lang.Character::isLetter (158 bytes) 236 9 java.lang.CharacterDataLatin1::isLetter (20 bytes) 237 10 java.lang.CharacterDataLatin1::getType (10 bytes) 237 11 java.util.BitSet::wordIndex (5 bytes) 237 12 java.util.BitSet::checkInvariants (111 bytes) 238 13 java.util.BitSet::get (69 bytes) 245 14 java.lang.Object::(1 bytes) 250 15 sun.nio.cs.UTF_8$Encoder::encodeArrayLoop (490 bytes) 261 16 java.lang.Math::min (11 bytes) 267 17 java.nio.Buffer::position (43 bytes) 267 18 java.nio.charset.CoderResult::isUnderflow (13 bytes) --- n java.lang.System::arraycopy (static) 287 19 java.nio.Buffer::limit (62 bytes) 287 20 java.nio.Buffer:: (68 bytes) 306 21 java.lang.String::equals (88 bytes) 326 22 java.nio.Buffer::hasRemaining (17 bytes) 326 23 java.nio.ByteBuffer:: (45 bytes) 326 24 ! java.nio.Bits::byteOrder (119 bytes) 326 25 java.nio.CharBuffer::hasArray (20 bytes) 327 26 java.nio.ByteBuffer::hasArray (20 bytes) 327 27 java.nio.charset.CoderResult::isOverflow (14 bytes) 327 28 java.nio.CharBuffer:: (22 bytes) 327 29 ! java.nio.ByteBuffer::wrap (20 bytes) 328 30 java.nio.HeapByteBuffer:: (14 bytes) 329 31 ! java.nio.CharBuffer::wrap (20 bytes) 329 32 java.nio.HeapCharBuffer:: (14 bytes) 330 33 java.lang.StringCoding::access$000 (6 bytes) 330 34 java.lang.StringCoding::scale (7 bytes) 331 35 java.nio.charset.Charset::atBugLevel (53 bytes) 331 36 java.nio.ByteBuffer::wrap (8 bytes) 332 37 java.nio.charset.CharsetEncoder:: (16 bytes) 332 38 java.nio.charset.CharsetEncoder:: (113 bytes) 334 39 java.nio.charset.CharsetEncoder::replaceWith (81 bytes) 334 40 java.nio.charset.CharsetEncoder::onMalformedInput (26 bytes) 335 41 java.nio.charset.CharsetEncoder::onUnmappableCharacter (26 bytes) 335 42 java.util.Arrays::copyOf (19 bytes) 335 43 java.lang.StringCoding$StringEncoder:: (7 bytes) 336 44 java.lang.StringCoding$StringEncoder:: (35 bytes) 338 45 ! java.lang.StringCoding$StringEncoder::encode (130 bytes) 339 46 java.nio.charset.CharsetEncoder::maxBytesPerChar (5 bytes) 339 47 java.nio.charset.CharsetEncoder::reset (11 bytes) 339 48 ! java.nio.charset.CharsetEncoder::encode (285 bytes) 345 49 java.nio.charset.CharsetEncoder::flush (49 bytes) 345 50 java.nio.charset.CharsetEncoder::implFlush (4 bytes) 345 51 java.lang.StringCoding::access$300 (7 bytes) 347 52 java.lang.StringCoding::safeTrim (30 bytes) 349 53 sun.nio.cs.UTF_8::newEncoder (10 bytes) 350 54 sun.nio.cs.UTF_8$Encoder:: (6 bytes) 351 55 sun.nio.cs.UTF_8$Encoder:: (10 bytes) 352 56 sun.nio.cs.UTF_8$Encoder::isLegalReplacement (26 bytes) 352 57 sun.nio.cs.UTF_8$Encoder::encodeLoop (28 bytes) 462 58 java.util.Arrays::copyOfRange (63 bytes) 463 59 java.nio.charset.Charset::lookup (44 bytes) 465 60 java.nio.charset.Charset::forName (20 bytes) 520 1% b.A::measure @ 14 (47 bytes) 7009 1% made not entrant b.A::measure @ -2 (47 bytes) 7010 48 ! made not entrant java.nio.charset.CharsetEncoder::encode (285 bytes) 7010 61 b.A::measure (47 bytes) //この行以降が2回目のmeasureメソッド呼出し後 7014 2% b.A::measure @ 14 (47 bytes)
java.nioパッケージのAPIに対するJITコンパイルが増えています。
このことから次のような推測が導かれます。
- (Java VM自体の性能改善よりもむしろ)java.nioパッケージを使うように改善したことによる性能差 or / and
- java.nioパッケージ自体の改善による性能差
0 件のコメント:
コメントを投稿