stringtokenizer java-性能
在Java中,假设我有一个带有5个delims的字符串,例如“abc;123;123;abc;123”,并且通常具有相同的字符串长度。我需要验证每个项目,不要太冗长 什么更快stringtokenizer java-性能,java,string,stringtokenizer,Java,String,Stringtokenizer,在Java中,假设我有一个带有5个delims的字符串,例如“abc;123;123;abc;123”,并且通常具有相同的字符串长度。我需要验证每个项目,不要太冗长 什么更快 if (stoken.hasMoreTokens()) { final String test=stoken.nextToken(); } else { throw new ParseException("Some msg",0); } 或 或 或者使用split() 选项1已给出 import java
if (stoken.hasMoreTokens()) {
final String test=stoken.nextToken();
} else {
throw new ParseException("Some msg",0);
}
或
或
或者使用
split()
选项1已给出
import java.text.ParseException;
import java.util.StringTokenizer;
public class stringtok
{
public static void main(String[] argv)
throws Exception
{
String data="ABC";
final StringTokenizer stoken=new StringTokenizer(data.toString(),";");
if (stoken.hasMoreTokens()) {
final String test=stoken.nextToken();
} else {
throw new ParseException("Some msg",0);
}
}
}
以字节码生成
Compiled from "stringtok.java"
public class stringtok {
public stringtok();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]) throws java.lang.Exception;
Code:
0: ldc #2 // String ABC
2: astore_1
3: new #3 // class java/util/StringTokenizer
6: dup
7: aload_1
8: invokevirtual #4 // Method java/lang/String.toString:()Ljava/lang/String;
11: ldc #5 // String ;
13: invokespecial #6 // Method java/util/StringTokenizer."<init>":(Ljava/lang/String;Ljava/lang/String;)V
16: astore_2
17: aload_2
18: invokevirtual #7 // Method java/util/StringTokenizer.hasMoreTokens:()Z
21: ifeq 32
24: aload_2
25: invokevirtual #8 // Method java/util/StringTokenizer.nextToken:()Ljava/lang/String;
28: astore_3
29: goto 43
32: new #9 // class java/text/ParseException
35: dup
36: ldc #10 // String Some msg
38: iconst_0
39: invokespecial #11 // Method java/text/ParseException."<init>":(Ljava/lang/String;I)V
42: athrow
43: return
Compiled from "stringtok2.java"
public class stringtok2 {
public stringtok2();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]) throws java.lang.Exception;
Code:
0: ldc #2 // String ABC
2: astore_1
3: new #3 // class java/util/StringTokenizer
6: dup
7: aload_1
8: invokevirtual #4 // Method java/lang/String.toString:()Ljava/lang/String;
11: ldc #5 // String ;
13: invokespecial #6 // Method java/util/StringTokenizer."<init>":(Ljava/lang/String;Ljava/lang/String;)V
16: astore_2
17: aload_2
18: invokevirtual #7 // Method java/util/StringTokenizer.hasMoreTokens:()Z
21: ifne 35
24: new #8 // class java/text/ParseException
27: dup
28: ldc #9 // String Some msg
30: iconst_0
31: invokespecial #10 // Method java/text/ParseException."<init>":(Ljava/lang/String;I)V
34: athrow
35: aload_2
36: invokevirtual #11 // Method java/util/StringTokenizer.nextToken:()Ljava/lang/String;
39: astore_3
40: return
}
以字节码生成
Compiled from "stringtok.java"
public class stringtok {
public stringtok();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]) throws java.lang.Exception;
Code:
0: ldc #2 // String ABC
2: astore_1
3: new #3 // class java/util/StringTokenizer
6: dup
7: aload_1
8: invokevirtual #4 // Method java/lang/String.toString:()Ljava/lang/String;
11: ldc #5 // String ;
13: invokespecial #6 // Method java/util/StringTokenizer."<init>":(Ljava/lang/String;Ljava/lang/String;)V
16: astore_2
17: aload_2
18: invokevirtual #7 // Method java/util/StringTokenizer.hasMoreTokens:()Z
21: ifeq 32
24: aload_2
25: invokevirtual #8 // Method java/util/StringTokenizer.nextToken:()Ljava/lang/String;
28: astore_3
29: goto 43
32: new #9 // class java/text/ParseException
35: dup
36: ldc #10 // String Some msg
38: iconst_0
39: invokespecial #11 // Method java/text/ParseException."<init>":(Ljava/lang/String;I)V
42: athrow
43: return
Compiled from "stringtok2.java"
public class stringtok2 {
public stringtok2();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]) throws java.lang.Exception;
Code:
0: ldc #2 // String ABC
2: astore_1
3: new #3 // class java/util/StringTokenizer
6: dup
7: aload_1
8: invokevirtual #4 // Method java/lang/String.toString:()Ljava/lang/String;
11: ldc #5 // String ;
13: invokespecial #6 // Method java/util/StringTokenizer."<init>":(Ljava/lang/String;Ljava/lang/String;)V
16: astore_2
17: aload_2
18: invokevirtual #7 // Method java/util/StringTokenizer.hasMoreTokens:()Z
21: ifne 35
24: new #8 // class java/text/ParseException
27: dup
28: ldc #9 // String Some msg
30: iconst_0
31: invokespecial #10 // Method java/text/ParseException."<init>":(Ljava/lang/String;I)V
34: athrow
35: aload_2
36: invokevirtual #11 // Method java/util/StringTokenizer.nextToken:()Ljava/lang/String;
39: astore_3
40: return
}
从“stringtok2.java”编译而来
公共类stringtok2{
公共关系2();
代码:
0:aload_0
1:invokespecial#1//方法java/lang/Object。“:()V
4:返回
publicstaticvoidmain(java.lang.String[])抛出java.lang.Exception;
代码:
0:ldc#2//字符串ABC
2:astore_1
3:新的#3//类java/util/StringTokenizer
6:dup
7:aload_1
8:invokevirtual#4//方法java/lang/String.toString:()Ljava/lang/String;
11:ldc#5//字符串;
13:invokespecial#6//方法java/util/StringTokenizer。”“:(Ljava/lang/String;Ljava/lang/String;)V
16:astore_2
17:aload_2
18:invokevirtual#7//方法java/util/StringTokenizer.hasMoreTokens:()Z
21:ifne 35
24:new#8//classjava/text/ParseException
27:dup
28:ldc#9//串一些味精
30:iconst_0
31:invokespecial#10//方法java/text/ParseException.“:(Ljava/lang/String;I)V
34:athrow
35:aload_2
36:invokevirtual#11//方法java/util/StringTokenizer.nextToken:()Ljava/lang/String;
39:astore_3
40:返回
}
因此答案是选项2和3,因为它们在理论上比字节码指令少
有人能确认一下吗?有人能确认一下吗
选项1已给出
import java.text.ParseException;
import java.util.StringTokenizer;
public class stringtok
{
public static void main(String[] argv)
throws Exception
{
String data="ABC";
final StringTokenizer stoken=new StringTokenizer(data.toString(),";");
if (stoken.hasMoreTokens()) {
final String test=stoken.nextToken();
} else {
throw new ParseException("Some msg",0);
}
}
}
以字节码生成
Compiled from "stringtok.java"
public class stringtok {
public stringtok();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]) throws java.lang.Exception;
Code:
0: ldc #2 // String ABC
2: astore_1
3: new #3 // class java/util/StringTokenizer
6: dup
7: aload_1
8: invokevirtual #4 // Method java/lang/String.toString:()Ljava/lang/String;
11: ldc #5 // String ;
13: invokespecial #6 // Method java/util/StringTokenizer."<init>":(Ljava/lang/String;Ljava/lang/String;)V
16: astore_2
17: aload_2
18: invokevirtual #7 // Method java/util/StringTokenizer.hasMoreTokens:()Z
21: ifeq 32
24: aload_2
25: invokevirtual #8 // Method java/util/StringTokenizer.nextToken:()Ljava/lang/String;
28: astore_3
29: goto 43
32: new #9 // class java/text/ParseException
35: dup
36: ldc #10 // String Some msg
38: iconst_0
39: invokespecial #11 // Method java/text/ParseException."<init>":(Ljava/lang/String;I)V
42: athrow
43: return
Compiled from "stringtok2.java"
public class stringtok2 {
public stringtok2();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]) throws java.lang.Exception;
Code:
0: ldc #2 // String ABC
2: astore_1
3: new #3 // class java/util/StringTokenizer
6: dup
7: aload_1
8: invokevirtual #4 // Method java/lang/String.toString:()Ljava/lang/String;
11: ldc #5 // String ;
13: invokespecial #6 // Method java/util/StringTokenizer."<init>":(Ljava/lang/String;Ljava/lang/String;)V
16: astore_2
17: aload_2
18: invokevirtual #7 // Method java/util/StringTokenizer.hasMoreTokens:()Z
21: ifne 35
24: new #8 // class java/text/ParseException
27: dup
28: ldc #9 // String Some msg
30: iconst_0
31: invokespecial #10 // Method java/text/ParseException."<init>":(Ljava/lang/String;I)V
34: athrow
35: aload_2
36: invokevirtual #11 // Method java/util/StringTokenizer.nextToken:()Ljava/lang/String;
39: astore_3
40: return
}
以字节码生成
Compiled from "stringtok.java"
public class stringtok {
public stringtok();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]) throws java.lang.Exception;
Code:
0: ldc #2 // String ABC
2: astore_1
3: new #3 // class java/util/StringTokenizer
6: dup
7: aload_1
8: invokevirtual #4 // Method java/lang/String.toString:()Ljava/lang/String;
11: ldc #5 // String ;
13: invokespecial #6 // Method java/util/StringTokenizer."<init>":(Ljava/lang/String;Ljava/lang/String;)V
16: astore_2
17: aload_2
18: invokevirtual #7 // Method java/util/StringTokenizer.hasMoreTokens:()Z
21: ifeq 32
24: aload_2
25: invokevirtual #8 // Method java/util/StringTokenizer.nextToken:()Ljava/lang/String;
28: astore_3
29: goto 43
32: new #9 // class java/text/ParseException
35: dup
36: ldc #10 // String Some msg
38: iconst_0
39: invokespecial #11 // Method java/text/ParseException."<init>":(Ljava/lang/String;I)V
42: athrow
43: return
Compiled from "stringtok2.java"
public class stringtok2 {
public stringtok2();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]) throws java.lang.Exception;
Code:
0: ldc #2 // String ABC
2: astore_1
3: new #3 // class java/util/StringTokenizer
6: dup
7: aload_1
8: invokevirtual #4 // Method java/lang/String.toString:()Ljava/lang/String;
11: ldc #5 // String ;
13: invokespecial #6 // Method java/util/StringTokenizer."<init>":(Ljava/lang/String;Ljava/lang/String;)V
16: astore_2
17: aload_2
18: invokevirtual #7 // Method java/util/StringTokenizer.hasMoreTokens:()Z
21: ifne 35
24: new #8 // class java/text/ParseException
27: dup
28: ldc #9 // String Some msg
30: iconst_0
31: invokespecial #10 // Method java/text/ParseException."<init>":(Ljava/lang/String;I)V
34: athrow
35: aload_2
36: invokevirtual #11 // Method java/util/StringTokenizer.nextToken:()Ljava/lang/String;
39: astore_3
40: return
}
从“stringtok2.java”编译而来
公共类stringtok2{
公共关系2();
代码:
0:aload_0
1:invokespecial#1//方法java/lang/Object。“:()V
4:返回
publicstaticvoidmain(java.lang.String[])抛出java.lang.Exception;
代码:
0:ldc#2//字符串ABC
2:astore_1
3:新的#3//类java/util/StringTokenizer
6:dup
7:aload_1
8:invokevirtual#4//方法java/lang/String.toString:()Ljava/lang/String;
11:ldc#5//字符串;
13:invokespecial#6//方法java/util/StringTokenizer。”“:(Ljava/lang/String;Ljava/lang/String;)V
16:astore_2
17:aload_2
18:invokevirtual#7//方法java/util/StringTokenizer.hasMoreTokens:()Z
21:ifne 35
24:new#8//classjava/text/ParseException
27:dup
28:ldc#9//串一些味精
30:iconst_0
31:invokespecial#10//方法java/text/ParseException.“:(Ljava/lang/String;I)V
34:athrow
35:aload_2
36:invokevirtual#11//方法java/util/StringTokenizer.nextToken:()Ljava/lang/String;
39:astore_3
40:返回
}
因此答案是选项2和3,因为它们在理论上比字节码指令少
有人能确认一下吗?你确定这很重要吗?代码已经过分析,这一部分是瓶颈所在吗?我对理论的理解是,我建议避免像这样浪费时间的微观优化尝试,而是将重点放在更重要的问题上,比如为什么String#split(…)
一般建议优于StringTokenizer(根据API)。了解拆分速度要慢得多,我很想知道当我需要节省宝贵的毫秒时,拆分会产生什么影响。我仔细阅读了这两个代码,并很好地掌握了它们,我不需要返回数组,也不需要担心空的标记。slit使用正则表达式,这可能有点慢。这三个代码片段做的事情完全相同。花括号的存在与否没有任何区别,无论您测试的是正常情况还是异常情况都无关紧要。选择你认为可读性和可维护性最好的。你确定这很重要吗?代码已经过分析,这一部分是瓶颈所在吗?我对理论的理解是,我建议避免像这样浪费时间的微观优化尝试,而是专注于更重要的问题,比如为什么一般推荐使用String#split(…)
而不是StringTokenizer(根据API)。了解split的速度要慢得多,我很想知道当我需要节省宝贵的毫秒时,它会有什么不同。我仔细阅读了这两个代码,并很好地掌握了它们,我不需要返回数组,也不需要担心空的标记。slit使用正则表达式,这可能有点慢。这三个代码片段做的事情完全相同。花括号的存在与否没有任何区别,无论您测试的是正常情况还是异常情况都无关紧要。选择您认为可读性和可维护性最好的内容。