ITPUB论坛 » Java入门与认证版 » JAVA inline 求助


2008-6-18 11:22 it01
JAVA inline 求助

在一个人的讲解中举了这个例子

Java代码
public class InlineMe {   
  int counter = 0;   
  public void method1() {   
    for (int i=0;i<1000;i++) {   
      addCount();   
      System.out.println("counter="+counter);   
    }   
  }   
  
  public int addCount() {   
    counter = counter + 1;   
    return counter;   
  }   
  
  public static void main(String args[]) {   
    InlineMe im = new InlineMe();   
    im.method1();   
  }   
}  

public class InlineMe {
  int counter = 0;
  public void method1() {
    for (int i=0;i<1000;i++) {
      addCount();
      System.out.println("counter="+counter);
    }
  }

  public int addCount() {
    counter = counter + 1;
    return counter;
  }

  public static void main(String args[]) {
    InlineMe im = new InlineMe();
    im.method1();
  }
}

在当前状态,addCount方法对JVM中内联探测器显得是没有什么吸引力的,因为addCount方法返回一个值。 要发现该方法是否被内联:

java -Xrunhprof:cpu=times InlineMe

它生成一个java.hprof.txt输出文件。类似下面的结果:

CPU TIME (ms) BEGIN (total = 1672) Thu Nov 08 19:37:06 2007
rank self accum count trace method
1 12.14% 12.14% 2000 300927 sun.nio.cs.ext.DoubleByteEncoder.encodeArrayLoop
2 6.58% 18.72% 2000 300953 sun.nio.cs.StreamEncoder.writeBytes
3 6.52% 25.24% 2000 300931 java.nio.charset.CharsetEncoder.encode
4 3.71% 28.95% 2000 300950 java.io.BufferedOutputStream.flush
5 2.87% 31.82% 2000 300934 sun.nio.cs.StreamEncoder.implWrite
6 2.87% 34.69% 2000 300913 java.nio.HeapCharBuffer.<init>
7 2.75% 37.44% 2001 300085 java.nio.Buffer.<init>
8 1.91% 39.35% 1000 300955 sun.nio.cs.StreamEncoder.flushBuffer
9 1.91% 41.27% 1000 300895 java.lang.StringBuilder.<init>
10 1.91% 43.18% 2000 300916 java.nio.CharBuffer.hasArray
11 1.91% 45.10% 1000 300960 java.io.PrintStream.print
12 1.91% 47.01% 1000 300975 sun.nio.cs.StreamEncoder.flushBuffer
13 1.91% 48.92% 1000 300978 java.io.OutputStream.flush
14 1.91% 50.84% 2000 300947 java.io.FileOutputStream.write
15 1.91% 52.75% 2000 300941 java.nio.Buffer.limit
16 1.91% 54.67% 2001 300083 java.nio.Buffer.limit
17 1.91% 56.58% 1000 300935 sun.nio.cs.StreamEncoder.write
18 1.91% 58.49% 12893 300924 sun.nio.cs.Surrogate.is
19 1.85% 60.35% 2000 300932 java.nio.charset.CoderResult.isUnderflow
20 1.85% 62.20% 6000 300923 java.nio.ByteBuffer.arrayOffset
21 1.85% 64.06% 1000 300954 sun.nio.cs.StreamEncoder.implFlushBuffer
22 1.85% 65.91% 6000 300919 java.nio.CharBuffer.arrayOffset
23 1.85% 67.76% 2000 300933 java.nio.Buffer.remaining
24 1.79% 69.56% 2000 300948 java.io.BufferedOutputStream.flushBuffer
25 1.79% 71.35% 1000 300980 java.io.PrintStream.newLine
26 1.79% 73.15% 1000 300971 java.io.OutputStreamWriter.write
27 0.96% 74.10% 12893 300925 sun.nio.cs.ext.DoubleByteEncoder.encodeSingle
28 0.96% 75.06% 1000 300959 java.io.PrintStream.write
29 0.96% 76.02% 2000 300915 java.nio.Buffer.hasRemaining
30 0.96% 76.97% 2000 300928 sun.nio.cs.ext.DoubleByteEncoder.encodeLoop
31 0.96% 77.93% 1000 300909 java.io.Writer.write
32 0.96% 78.89% 1000 300967 java.io.Writer.write
33 0.96% 79.84% 1000 300894 java.lang.StringBuilder.append
34 0.96% 80.80% 1 300629 sun.net.[url]www.ParseUtil.decode[/url]
[color=Red]35 0.96% 81.76% 1 300982 com.spr.base.InlineMe.method1 [/color]
36 0.96% 82.72% 5 300276 java.lang.String.toLowerCase
37 0.96% 83.67% 5 300260 java.io.Win32FileSystem.normalize
38 0.96% 84.63% 12 300174 java.net.URL.getRef
39 0.96% 85.59% 1000 300937 java.io.BufferedWriter.flushBuffer
40 0.96% 86.54% 1000 300964 java.io.BufferedWriter.min
41 0.90% 87.44% 1000 300972 java.io.BufferedWriter.flushBuffer
42 0.90% 88.34% 1000 300966 java.io.BufferedWriter.write
43 0.90% 89.23% 1000 300961 java.io.PrintStream.ensureOpen
44 0.90% 90.13% 2000 300952 java.nio.Buffer.clear
45 0.90% 91.03% 2000 300946 java.io.BufferedOutputStream.write
46 0.90% 91.93% 2000 300940 java.nio.Buffer.flip
47 0.90% 92.82% 2000 300917 java.nio.ByteBuffer.hasArray
48 0.90% 93.72% 2000 300914 java.nio.CharBuffer.wrap
49 0.90% 94.62% 1000 300908 java.io.BufferedWriter.write
50 0.90% 95.51% 1000 300893 java.lang.AbstractStringBuilder.append
51 0.90% 96.41% 1000 300890 java.lang.AbstractStringBuilder.<init>
[color=Red]52 0.90% 97.31% 1000 300881 com.spr.base.InlineMe.addCount [/color]53 0.90% 98.21% 1000 300968 java.io.BufferedWriter.newLine
54 0.90% 99.10% 27 300439 java.lang.String.charAt
55 0.90% 100.00% 1 300114 java.lang.StringCoding$StringDecoder.decode
CPU TIME (ms) END



如果将addCount方法改造为不再返回一个值,则虚拟机可在运行时将其内联:

Java代码
public void addCount() {   
  counter = counter+1;   
}  

public void addCount() {
  counter = counter+1;
}
再次运行profiler
java -Xrunhprof:cpu=times InlineMe
这次,java.hprof.txt的输出应该是不同的。addCount方法已经找不到了,它被内联了!

CPU TIME (ms) BEGIN (total = 1688) Thu Nov 08 19:45:06 2007
rank self accum count trace method
1 22.33% 22.33% 2000 300927 sun.nio.cs.ext.DoubleByteEncoder.encodeArrayLoop
2 6.46% 28.79% 12893 300924 sun.nio.cs.Surrogate.is
3 4.68% 33.47% 1000 300980 java.io.PrintStream.newLine
4 4.62% 38.09% 2000 300953 sun.nio.cs.StreamEncoder.writeBytes
5 2.84% 40.94% 2000 300934 sun.nio.cs.StreamEncoder.implWrite
6 2.78% 43.72% 2000 300931 java.nio.charset.CharsetEncoder.encode
7 2.78% 46.50% 1000 300966 java.io.BufferedWriter.write
8 2.78% 49.29% 1000 300938 sun.nio.cs.StreamEncoder.isOpen
9 2.73% 52.01% 2000 300928 sun.nio.cs.ext.DoubleByteEncoder.encodeLoop
10 1.90% 53.91% 2000 300944 java.nio.ByteBuffer.arrayOffset
11 1.84% 55.75% 2000 300932 java.nio.charset.CoderResult.isUnderflow
12 1.84% 57.58% 2000 300950 java.io.BufferedOutputStream.flush
13 1.84% 59.42% 2000 300947 java.io.FileOutputStream.write
14 1.84% 61.26% 1000 300976 java.io.OutputStreamWriter.flushBuffer
15 1.84% 63.09% 2000 300941 java.nio.Buffer.limit
16 1.84% 64.93% 1000 300975 sun.nio.cs.StreamEncoder.flushBuffer
[color=Red]17 1.84% 66.77% 1 300982 com.spr.base.InlineMe.method1 [/color]18 1.78% 68.54% 1000 300972 java.io.BufferedWriter.flushBuffer
19 1.78% 70.32% 1000 300935 sun.nio.cs.StreamEncoder.write
20 0.95% 71.27% 1000 300973 sun.nio.cs.StreamEncoder.isOpen
21 0.95% 72.22% 1000 300974 sun.nio.cs.StreamEncoder.implFlushBuffer
22 0.95% 73.16% 16 300238 java.lang.AbstractStringBuilder.expandCapacity
23 0.95% 74.11% 1000 300960 java.io.PrintStream.print
24 0.95% 75.06% 1000 300959 java.io.PrintStream.write
25 0.95% 76.01% 1000 300958 java.lang.String.indexOf
26 0.95% 76.95% 2000 300949 java.io.OutputStream.flush
27 0.95% 77.90% 5 300295 sun.misc.URLClassPath$JarLoader.<init>
28 0.95% 78.85% 2000 300940 java.nio.Buffer.flip
29 0.95% 79.80% 1000 300937 java.io.BufferedWriter.flushBuffer
30 0.95% 80.75% 1000 300979 java.io.BufferedOutputStream.flush
31 0.95% 81.69% 2000 300929 java.nio.charset.CoderResult.isOverflow
32 0.95% 82.64% 6000 300923 java.nio.ByteBuffer.arrayOffset
33 0.95% 83.59% 4000 300921 java.nio.Buffer.limit
34 0.95% 84.54% 2001 300084 java.nio.Buffer.position
35 0.95% 85.49% 6000 300919 java.nio.CharBuffer.arrayOffset
36 0.95% 86.43% 2000 300917 java.nio.ByteBuffer.hasArray
37 0.95% 87.38% 6 300580 java.lang.Integer.parseInt
38 0.95% 88.33% 1000 300908 java.io.BufferedWriter.write
39 0.95% 89.28% 1000 300890 java.lang.AbstractStringBuilder.<init>
40 0.95% 90.23% 1000 300901 java.lang.String.<init>
41 0.89% 91.11% 1000 300896 java.lang.AbstractStringBuilder.stringSizeOfInt
42 0.89% 92.00% 1000 300892 java.lang.String.getChars
43 0.89% 92.89% 1000 300902 java.lang.StringBuilder.toString
44 0.89% 93.78% 2 300661 java.io.Win32FileSystem.normalize
45 0.89% 94.67% 2000 300914 java.nio.CharBuffer.wrap
46 0.89% 95.56% 1000 300978 java.io.OutputStream.flush
47 0.89% 96.45% 1 300352 sun.net.[url]www.ParseUtil.decode[/url]
48 0.89% 97.33% 2000 300945 java.io.PrintStream.ensureOpen
49 0.89% 98.22% 1000 300963 java.io.BufferedWriter.ensureOpen
50 0.89% 99.11% 4000 300920 java.nio.Buffer.position
51 0.89% 100.00% 2001 300083 java.nio.Buffer.limit
CPU TIME (ms) END

2008-6-18 11:22 it01
JAVA inline 求助

在一个人的讲解中举了这个例子

Java代码
public class InlineMe {   
  int counter = 0;   
  public void method1() {   
    for (int i=0;i<1000;i++) {   
      addCount();   
      System.out.println("counter="+counter);   
    }   
  }   
  
  public int addCount() {   
    counter = counter + 1;   
    return counter;   
  }   
  
  public static void main(String args[]) {   
    InlineMe im = new InlineMe();   
    im.method1();   
  }   
}  

public class InlineMe {
  int counter = 0;
  public void method1() {
    for (int i=0;i<1000;i++) {
      addCount();
      System.out.println("counter="+counter);
    }
  }

  public int addCount() {
    counter = counter + 1;
    return counter;
  }

  public static void main(String args[]) {
    InlineMe im = new InlineMe();
    im.method1();
  }
}

在当前状态,addCount方法对JVM中内联探测器显得是没有什么吸引力的,因为addCount方法返回一个值。 要发现该方法是否被内联:

java -Xrunhprof:cpu=times InlineMe

它生成一个java.hprof.txt输出文件。类似下面的结果:

CPU TIME (ms) BEGIN (total = 1672) Thu Nov 08 19:37:06 2007
rank self accum count trace method
1 12.14% 12.14% 2000 300927 sun.nio.cs.ext.DoubleByteEncoder.encodeArrayLoop
2 6.58% 18.72% 2000 300953 sun.nio.cs.StreamEncoder.writeBytes
3 6.52% 25.24% 2000 300931 java.nio.charset.CharsetEncoder.encode
4 3.71% 28.95% 2000 300950 java.io.BufferedOutputStream.flush
5 2.87% 31.82% 2000 300934 sun.nio.cs.StreamEncoder.implWrite
6 2.87% 34.69% 2000 300913 java.nio.HeapCharBuffer.<init>
7 2.75% 37.44% 2001 300085 java.nio.Buffer.<init>
8 1.91% 39.35% 1000 300955 sun.nio.cs.StreamEncoder.flushBuffer
9 1.91% 41.27% 1000 300895 java.lang.StringBuilder.<init>
10 1.91% 43.18% 2000 300916 java.nio.CharBuffer.hasArray
11 1.91% 45.10% 1000 300960 java.io.PrintStream.print
12 1.91% 47.01% 1000 300975 sun.nio.cs.StreamEncoder.flushBuffer
13 1.91% 48.92% 1000 300978 java.io.OutputStream.flush
14 1.91% 50.84% 2000 300947 java.io.FileOutputStream.write
15 1.91% 52.75% 2000 300941 java.nio.Buffer.limit
16 1.91% 54.67% 2001 300083 java.nio.Buffer.limit
17 1.91% 56.58% 1000 300935 sun.nio.cs.StreamEncoder.write
18 1.91% 58.49% 12893 300924 sun.nio.cs.Surrogate.is
19 1.85% 60.35% 2000 300932 java.nio.charset.CoderResult.isUnderflow
20 1.85% 62.20% 6000 300923 java.nio.ByteBuffer.arrayOffset
21 1.85% 64.06% 1000 300954 sun.nio.cs.StreamEncoder.implFlushBuffer
22 1.85% 65.91% 6000 300919 java.nio.CharBuffer.arrayOffset
23 1.85% 67.76% 2000 300933 java.nio.Buffer.remaining
24 1.79% 69.56% 2000 300948 java.io.BufferedOutputStream.flushBuffer
25 1.79% 71.35% 1000 300980 java.io.PrintStream.newLine
26 1.79% 73.15% 1000 300971 java.io.OutputStreamWriter.write
27 0.96% 74.10% 12893 300925 sun.nio.cs.ext.DoubleByteEncoder.encodeSingle
28 0.96% 75.06% 1000 300959 java.io.PrintStream.write
29 0.96% 76.02% 2000 300915 java.nio.Buffer.hasRemaining
30 0.96% 76.97% 2000 300928 sun.nio.cs.ext.DoubleByteEncoder.encodeLoop
31 0.96% 77.93% 1000 300909 java.io.Writer.write
32 0.96% 78.89% 1000 300967 java.io.Writer.write
33 0.96% 79.84% 1000 300894 java.lang.StringBuilder.append
34 0.96% 80.80% 1 300629 sun.net.[url]www.ParseUtil.decode[/url]
[color=Red]35 0.96% 81.76% 1 300982 com.spr.base.InlineMe.method1 [/color]
36 0.96% 82.72% 5 300276 java.lang.String.toLowerCase
37 0.96% 83.67% 5 300260 java.io.Win32FileSystem.normalize
38 0.96% 84.63% 12 300174 java.net.URL.getRef
39 0.96% 85.59% 1000 300937 java.io.BufferedWriter.flushBuffer
40 0.96% 86.54% 1000 300964 java.io.BufferedWriter.min
41 0.90% 87.44% 1000 300972 java.io.BufferedWriter.flushBuffer
42 0.90% 88.34% 1000 300966 java.io.BufferedWriter.write
43 0.90% 89.23% 1000 300961 java.io.PrintStream.ensureOpen
44 0.90% 90.13% 2000 300952 java.nio.Buffer.clear
45 0.90% 91.03% 2000 300946 java.io.BufferedOutputStream.write
46 0.90% 91.93% 2000 300940 java.nio.Buffer.flip
47 0.90% 92.82% 2000 300917 java.nio.ByteBuffer.hasArray
48 0.90% 93.72% 2000 300914 java.nio.CharBuffer.wrap
49 0.90% 94.62% 1000 300908 java.io.BufferedWriter.write
50 0.90% 95.51% 1000 300893 java.lang.AbstractStringBuilder.append
51 0.90% 96.41% 1000 300890 java.lang.AbstractStringBuilder.<init>
[color=Red]52 0.90% 97.31% 1000 300881 com.spr.base.InlineMe.addCount [/color]53 0.90% 98.21% 1000 300968 java.io.BufferedWriter.newLine
54 0.90% 99.10% 27 300439 java.lang.String.charAt
55 0.90% 100.00% 1 300114 java.lang.StringCoding$StringDecoder.decode
CPU TIME (ms) END



如果将addCount方法改造为不再返回一个值,则虚拟机可在运行时将其内联:

Java代码
public void addCount() {   
  counter = counter+1;   
}  

public void addCount() {
  counter = counter+1;
}
再次运行profiler
java -Xrunhprof:cpu=times InlineMe
这次,java.hprof.txt的输出应该是不同的。addCount方法已经找不到了,它被内联了!

CPU TIME (ms) BEGIN (total = 1688) Thu Nov 08 19:45:06 2007
rank self accum count trace method
1 22.33% 22.33% 2000 300927 sun.nio.cs.ext.DoubleByteEncoder.encodeArrayLoop
2 6.46% 28.79% 12893 300924 sun.nio.cs.Surrogate.is
3 4.68% 33.47% 1000 300980 java.io.PrintStream.newLine
4 4.62% 38.09% 2000 300953 sun.nio.cs.StreamEncoder.writeBytes
5 2.84% 40.94% 2000 300934 sun.nio.cs.StreamEncoder.implWrite
6 2.78% 43.72% 2000 300931 java.nio.charset.CharsetEncoder.encode
7 2.78% 46.50% 1000 300966 java.io.BufferedWriter.write
8 2.78% 49.29% 1000 300938 sun.nio.cs.StreamEncoder.isOpen
9 2.73% 52.01% 2000 300928 sun.nio.cs.ext.DoubleByteEncoder.encodeLoop
10 1.90% 53.91% 2000 300944 java.nio.ByteBuffer.arrayOffset
11 1.84% 55.75% 2000 300932 java.nio.charset.CoderResult.isUnderflow
12 1.84% 57.58% 2000 300950 java.io.BufferedOutputStream.flush
13 1.84% 59.42% 2000 300947 java.io.FileOutputStream.write
14 1.84% 61.26% 1000 300976 java.io.OutputStreamWriter.flushBuffer
15 1.84% 63.09% 2000 300941 java.nio.Buffer.limit
16 1.84% 64.93% 1000 300975 sun.nio.cs.StreamEncoder.flushBuffer
[color=Red]17 1.84% 66.77% 1 300982 com.spr.base.InlineMe.method1 [/color]18 1.78% 68.54% 1000 300972 java.io.BufferedWriter.flushBuffer
19 1.78% 70.32% 1000 300935 sun.nio.cs.StreamEncoder.write
20 0.95% 71.27% 1000 300973 sun.nio.cs.StreamEncoder.isOpen
21 0.95% 72.22% 1000 300974 sun.nio.cs.StreamEncoder.implFlushBuffer
22 0.95% 73.16% 16 300238 java.lang.AbstractStringBuilder.expandCapacity
23 0.95% 74.11% 1000 300960 java.io.PrintStream.print
24 0.95% 75.06% 1000 300959 java.io.PrintStream.write
25 0.95% 76.01% 1000 300958 java.lang.String.indexOf
26 0.95% 76.95% 2000 300949 java.io.OutputStream.flush
27 0.95% 77.90% 5 300295 sun.misc.URLClassPath$JarLoader.<init>
28 0.95% 78.85% 2000 300940 java.nio.Buffer.flip
29 0.95% 79.80% 1000 300937 java.io.BufferedWriter.flushBuffer
30 0.95% 80.75% 1000 300979 java.io.BufferedOutputStream.flush
31 0.95% 81.69% 2000 300929 java.nio.charset.CoderResult.isOverflow
32 0.95% 82.64% 6000 300923 java.nio.ByteBuffer.arrayOffset
33 0.95% 83.59% 4000 300921 java.nio.Buffer.limit
34 0.95% 84.54% 2001 300084 java.nio.Buffer.position
35 0.95% 85.49% 6000 300919 java.nio.CharBuffer.arrayOffset
36 0.95% 86.43% 2000 300917 java.nio.ByteBuffer.hasArray
37 0.95% 87.38% 6 300580 java.lang.Integer.parseInt
38 0.95% 88.33% 1000 300908 java.io.BufferedWriter.write
39 0.95% 89.28% 1000 300890 java.lang.AbstractStringBuilder.<init>
40 0.95% 90.23% 1000 300901 java.lang.String.<init>
41 0.89% 91.11% 1000 300896 java.lang.AbstractStringBuilder.stringSizeOfInt
42 0.89% 92.00% 1000 300892 java.lang.String.getChars
43 0.89% 92.89% 1000 300902 java.lang.StringBuilder.toString
44 0.89% 93.78% 2 300661 java.io.Win32FileSystem.normalize
45 0.89% 94.67% 2000 300914 java.nio.CharBuffer.wrap
46 0.89% 95.56% 1000 300978 java.io.OutputStream.flush
47 0.89% 96.45% 1 300352 sun.net.[url]www.ParseUtil.decode[/url]
48 0.89% 97.33% 2000 300945 java.io.PrintStream.ensureOpen
49 0.89% 98.22% 1000 300963 java.io.BufferedWriter.ensureOpen
50 0.89% 99.11% 4000 300920 java.nio.Buffer.position
51 0.89% 100.00% 2001 300083 java.nio.Buffer.limit
CPU TIME (ms) END

2008-6-18 11:29 it01
但是我在自己本机进行试验的时候才发现好像不对

采用return

CPU TIME (ms) BEGIN (total = 2374) Wed Jun 18 11:06:53 2008
rank   self  accum   count trace method
   1 33.70% 33.70%    2000 301011 java.io.FileOutputStream.write
   2 11.42% 45.11%    2000 300991 sun.nio.cs.ext.DoubleByteEncoder.encodeArrayLoop
   3  3.37% 48.48%       4 300356 java.util.zip.ZipFile.<init>
   4  3.37% 51.85%    2000 301017 sun.nio.cs.StreamEncoder$CharsetSE.writeBytes
   5  2.53% 54.38%    1000 301044 java.io.PrintStream.newLine
   6  2.53% 56.91%    1000 301023 java.io.PrintStream.write
   7  2.11% 59.01%    6012 300337 java.nio.ByteBuffer.arrayOffset
   8  2.11% 61.12%    2000 300998 sun.nio.cs.StreamEncoder$CharsetSE.implWrite
   9  2.11% 63.23%    2000 300995 java.nio.charset.CharsetEncoder.encode
  10  2.11% 65.33%    2005 300083 java.nio.Buffer.<init>
  11  1.26% 66.60%    1000 300975 java.lang.StringBuilder.toString
  12  1.26% 67.86%    2000 301015 java.io.PrintStream.write
  13  1.26% 69.12%    2000 300987 java.nio.CharBuffer.wrap
  14  1.26% 70.39%   13116 300338 sun.nio.cs.Surrogate.is
  15  1.26% 71.65%    2000 300992 sun.nio.cs.ext.DoubleByteEncoder.encodeLoop
  16  0.84% 72.49%    2000 301014 java.io.BufferedOutputStream.flush
  17  0.84% 73.34%    1000 300969 java.lang.StringBuilder.append
  18  0.84% 74.18%    2000 301010 java.io.BufferedOutputStream.write
  19  0.84% 75.02%    1000 300968 java.lang.AbstractStringBuilder.append
  20  0.84% 75.86%    1000 300982 java.io.Writer.write
  21  0.84% 76.71%    2000 300985 java.nio.CharBuffer.<init>
  22  0.84% 77.55%    2000 301004 java.nio.Buffer.flip
  23  0.84% 78.39%    2000 300986 java.nio.HeapCharBuffer.<init>
  24  0.84% 79.23%    1000 300965 java.lang.StringBuilder.<init>
  25  0.84% 80.08%    4008 300335 java.nio.Buffer.limit
  26  0.84% 80.92%    1000 301036 java.io.BufferedWriter.flushBuffer
  27  0.84% 81.76%    1000 301043 java.io.BufferedOutputStream.flush
  28  0.84% 82.60%    1000 300973 java.lang.StringBuilder.append
  29  0.84% 83.45%    2000 300993 java.nio.charset.CoderResult.isOverflow
[color=Red]  30  0.84% 84.29%       1 301046 InlineMe.method1[/color]
  31  0.46% 84.75%    2000 300994 java.nio.charset.CoderResult.isUnderflow
  32  0.46% 85.21%    1000 300972 java.lang.AbstractStringBuilder.append
  33  0.46% 85.68%    1000 301001 java.io.BufferedWriter.flushBuffer
  34  0.42% 86.10%    2000 301003 java.nio.Buffer.position
  35  0.42% 86.52%    2000 301006 java.nio.Buffer.position


什么原因? 是执行太快了?

[[i] 本帖最后由 it01 于 2008-6-18 11:30 编辑 [/i]]

2008-6-18 11:45 dearmeiw
晕,你想干嘛???

2008-6-18 12:03 justforregister
好高深啊

2008-6-18 12:24 it01
[quote]原帖由 [i]dearmeiw[/i] 于 2008-6-18 11:45 AM 发表 [url=http://www.itpub.net/redirect.php?goto=findpost&pid=10700825&ptid=1007842][img]http://www.itpub.net/images/common/back.gif[/img][/url]
晕,你想干嘛??? [/quote]
恭喜!您刚拣到ITPUB送出的幸运红包。33PUB币!

如果您的浏览器没有自动跳转,请点击这里


哥  按照他说的  在有return的情况下,addcount要执行一次的,也就是cpu那能看到


但是我在本机上执行没有看到阿

2008-6-18 20:15 it01
up

2008-6-19 02:44 greenflute
JVM关于inline有一定的前提条件,但是做了下试验,和官方说法正好相反

[code]
public class InlineMe {
  int counter = 0;
  public void method1() {
    for (int i=0;i<1000;i++) {
      addCount();
      System.out.println("counter="+counter);
    }
  }

//  private final int addCount() {
//    counter = counter + 1;
//    return counter;
//  }

  private final void addCount() {
    counter = counter + 1;
  }
          
  public static void main(String args[]) {
    InlineMe im = new InlineMe();
    im.method1();
  }
}
[/code]
[code]
CPU TIME (ms) BEGIN (total = 1766) Wed Jun 18 20:41:48 2008
rank   self  accum   count trace method
   1 10.76% 10.76%    2000 301077 sun.nio.cs.SingleByteEncoder.encodeArrayLoop
   2  6.23% 16.99%    2000 301097 java.io.FileOutputStream.write
   3  5.27% 22.25%    2000 301100 java.io.BufferedOutputStream.flush
   4  4.36% 26.61%    2000 301103 sun.nio.cs.StreamEncoder$CharsetSE.writeBytes
   5  3.62% 30.24%    2000 301078 sun.nio.cs.SingleByteEncoder.encodeLoop
   6  3.57% 33.81%   12893 301075 java.lang.String.charAt
   7  2.66% 36.47%    1000 301130 java.io.PrintStream.newLine
   8  2.66% 39.13%    1000 301131 java.io.PrintStream.println
   9  2.60% 41.73%   12893 301074 sun.nio.cs.Surrogate.is
  10  2.60% 44.34%    1000 301055 java.io.BufferedWriter.write
  11  2.60% 46.94%    2000 301084 sun.nio.cs.StreamEncoder$CharsetSE.implWrite
  12  2.60% 49.55%    1000 301125 sun.nio.cs.StreamEncoder.flushBuffer
  13  1.81% 51.36%    2000 301059 java.nio.CharBuffer.<init>
  14  1.81% 53.17%    4000 301076 java.nio.Buffer.position
  15  1.81% 54.98%    2000 301065 java.nio.CharBuffer.array
  16  1.81% 56.80%    1000 301120 sun.nio.cs.StreamEncoder.write
  17  1.81% 58.61%    1000 301108 java.lang.String.indexOf
  18  1.81% 60.42%    2000 301098 java.io.BufferedOutputStream.flushBuffer
  19  1.76% 62.17%    2000 301081 java.nio.charset.CharsetEncoder.encode
  20  1.76% 63.93%    1000 301087 java.io.BufferedWriter.flushBuffer
  21  1.76% 65.69%    1000 301117 java.io.Writer.write
  22  1.76% 67.44%    1000 301109 java.io.PrintStream.write
  23  1.76% 69.20%    2000 301101 java.io.PrintStream.write
  24  1.70% 70.89%    1000 301047 java.lang.StringBuilder.append
  25  1.70% 72.59%    2000 301061 java.nio.CharBuffer.wrap
  26  0.91% 73.50%    2000 301082 java.nio.charset.CoderResult.isUnderflow
  27  0.91% 74.41%       4 300289 sun.net.[url]www.ParseUtil.decode[/url]
  28  0.91% 75.31%    1000 301110 java.io.PrintStream.print
  29  0.91% 76.22%    1000 301111 java.io.PrintStream.ensureOpen
  30  0.91% 77.12%    2001 300134 java.nio.Buffer.<init>
  31  0.91% 78.03%    2001 300133 java.nio.Buffer.position
  32  0.91% 78.94%    4000 301068 java.nio.Buffer.limit
  33  0.91% 79.84%    1000 301122 java.io.BufferedWriter.flushBuffer
  34  0.91% 80.75%    2000 301094 java.nio.ByteBuffer.arrayOffset
  35  0.91% 81.65%    2000 301060 java.nio.HeapCharBuffer.<init>
  36  0.91% 82.56%    1000 301124 sun.nio.cs.StreamEncoder$CharsetSE.implFlushBuffer
  37  0.91% 83.47%    2000 301058 sun.nio.cs.StreamEncoder.ensureOpen
  38  0.91% 84.37%    1000 301129 java.io.BufferedOutputStream.flush
  39  0.91% 85.28%       1 300417 java.util.jar.JarFile.getEntry
  40  0.91% 86.18%     726 300301 java.lang.String.charAt
  41  0.91% 87.09%    1000 301029 InlineMe.addCount
  42  0.91% 88.00%    1000 301041 java.lang.AbstractStringBuilder.append
  43  0.91% 88.90%    1000 301038 java.lang.AbstractStringBuilder.<init>
  44  0.91% 89.81%       1 300073 java.lang.ThreadLocal.createMap
  45  0.85% 90.66%    1000 301043 java.lang.StringBuilder.<init>
  46  0.85% 91.51%       2 300781 java.io.Win32FileSystem.normalize
  47  0.85% 92.36%       1 301132 InlineMe.method1
  48  0.85% 93.20%      12 300526 java.lang.Character.digit
  49  0.85% 94.05%    1000 301050 java.io.PrintStream.ensureOpen
  50  0.85% 94.90%       4 300334 java.io.Win32FileSystem.normalize
  51  0.85% 95.75%    1000 301115 java.lang.String.getChars
  52  0.85% 96.60%    2000 301083 java.nio.Buffer.remaining
  53  0.85% 97.45%    1000 301104 sun.nio.cs.StreamEncoder$CharsetSE.implFlushBuffer
  54  0.85% 98.30%    1000 301085 sun.nio.cs.StreamEncoder.write
  55  0.85% 99.15%    2001 300132 java.nio.Buffer.limit
  56  0.85% 100.00%    1000 301040 java.lang.String.getChars
CPU TIME (ms) END
[/code]

2008-6-19 02:46 greenflute
反倒是符合条件的,没有被内联,不符合条件的,缺省编译后却看不到调用信息。

反编译class文件,方法都没有丢失。

2008-6-19 12:52 prophetge
从来不研究这个 这个好像和JVM有关系 在不同的版本下面可能出不同的结果

2008-6-19 13:23 javalod
搞这么复杂

*** 作者被禁止或删除 内容自动屏蔽 ***

2008-6-23 16:16 it01
今天看java的白皮看到这么一段


有点明白究竟是啥意思了

2008-6-25 12:29 it01
up
谁能帮我解个惑

2008-6-25 13:33 xieye
猪头 好长啊 看的头晕!

2008-6-25 15:29 it01
楼上的猪头

那些很多是编译器输出的东西

不是我写的

2008-6-26 10:51 justforregister
太高深了, 不懂

2008-6-27 15:34 gangyaocn
[quote]原帖由 [i]it01[/i] 于 2008-6-18 11:29 发表 [url=http://www.itpub.net/redirect.php?goto=findpost&pid=10700374&ptid=1007842][img]http://www.itpub.net/images/common/back.gif[/img][/url]
但是我在自己本机进行试验的时候才发现好像不对

采用return

CPU TIME (ms) BEGIN (total = 2374) Wed Jun 18 11:06:53 2008
rank   self  accum   count trace method
   1 33.70% 33.70%    2000 301011 java.io.FileOutputStream.write
   2 11.42% 45.11%    2000 300991 sun.nio.cs.ext.DoubleByteEncoder.encodeArrayLoop
   3  3.37% 48.48%       4 300356 java.util.zip.ZipFile.
   4  3.37% 51.85%    2000 301017 sun.nio.cs.StreamEncoder$CharsetSE.writeBytes
   5  2.53% 54.38%    1000 301044 java.io.PrintStream.newLine
   6  2.53% 56.91%    1000 301023 java.io.PrintStream.write
   7  2.11% 59.01%    6012 300337 java.nio.ByteBuffer.arrayOffset
   8  2.11% 61.12%    2000 300998 sun.nio.cs.StreamEncoder$CharsetSE.implWrite
   9  2.11% 63.23%    2000 300995 java.nio.charset.CharsetEncoder.encode
  10  2.11% 65.33%    2005 300083 java.nio.Buffer.
  11  1.26% 66.60%    1000 300975 java.lang.StringBuilder.toString
  12  1.26% 67.86%    2000 301015 java.io.PrintStream.write
  13  1.26% 69.12%    2000 300987 java.nio.CharBuffer.wrap
  14  1.26% 70.39%   13116 300338 sun.nio.cs.Surrogate.is
  15  1.26% 71.65%    2000 300992 sun.nio.cs.ext.DoubleByteEncoder.encodeLoop
  16  0.84% 72.49%    2000 301014 java.io.BufferedOutputStream.flush
  17  0.84% 73.34%    1000 300969 java.lang.StringBuilder.append
  18  0.84% 74.18%    2000 301010 java.io.BufferedOutputStream.write
  19  0.84% 75.02%    1000 300968 java.lang.AbstractStringBuilder.append
  20  0.84% 75.86%    1000 300982 java.io.Writer.write
  21  0.84% 76.71%    2000 300985 java.nio.CharBuffer.
  22  0.84% 77.55%    2000 301004 java.nio.Buffer.flip
  23  0.84% 78.39%    2000 300986 java.nio.HeapCharBuffer.
  24  0.84% 79.23%    1000 300965 java.lang.StringBuilder.
  25  0.84% 80.08%    4008 300335 java.nio.Buffer.limit
  26  0.84% 80.92%    1000 301036 java.io.BufferedWriter.flushBuffer
  27  0.84% 81.76%    1000 301043 java.io.BufferedOutputStream.flush
  28  0.84% 82.60%    1000 300973 java.lang.StringBuilder.append
  29  0.84% 83.45%    2000 300993 java.nio.charset.CoderResult.isOverflow
  30  0.84% 84.29%       1 301046 InlineMe.method1
  31  0.46% 84.75%    2000 300994 java.nio.charset.CoderResult.isUnderflow
  32  0.46% 85.21%    1000 300972 java.lang.AbstractStringBuilder.append
  33  0.46% 85.68%    1000 301001 java.io.BufferedWriter.flushBuffer
  34  0.42% 86.10%    2000 301003 java.nio.Buffer.position
  35  0.42% 86.52%    2000 301006 java.nio.Buffer.position


什么原因? 是执行太快了? [/quote]


将循环次数加大,可以找到addCount这个方法的执行记录(trace结果也有)。发现都没有没优化即都没有被内联。使用javac -O 编译选项也没发生作用。

2008-7-12 17:37 easier_wjh
看不懂啊?

2008-7-17 22:58 asangel
关注一下

2008-7-18 15:39 voca
看得头晕

页: [1]
查看完整版本: JAVA inline 求助


Powered by ITPUB论坛