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-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]

Powered by ITPUB论坛