文字列操作の速度を測ってみた(やっつけ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 件のコメント:
コメントを投稿