2011/12/06

文字列操作の速度を測ってみた(やっつけ3)

文字列操作の速度を測ってみた(やっつけ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コンパイルが増えています。
このことから次のような推測が導かれます。

  1. (Java VM自体の性能改善よりもむしろ)java.nioパッケージを使うように改善したことによる性能差 or / and
  2. java.nioパッケージ自体の改善による性能差
これ以上の調査は辛いので、今回はここまで。

0 件のコメント:

コメントを投稿