我的问题是关于访问数据的两种可能方式:
(我的问题是关于java语句的“实际使用”,如下所示,在一个函数中访问数据2-10次。不使用数千次迭代/调用来迭代这类语句。)
System.out.println(request.getParameter("locale"));
System.out.println(request.getParameter("locale"));
System.out.println(request.getParameter("locale"));
System.out.println(request.getParameter("locale"));
System.out.println(request.getParameter("locale"));
对比
String localeString = request.getParameter("locale");
System.out.println(localeString);
System.out.println(localeString);
System.out.println(localeString);
System.out.println(localeString);
System.out.println(localeString);
哪个例子是“最快/最有效”的?(第二个更快吗?因为在5个println语句的顶部有变量赋值,这也将消耗CPU周期...)
Java编译器是否优化了示例1中的代码,使其看起来像字节码中的第二个示例?(=根本不需要自己在代码中进行任何优化)。
就CPU周期而言,对象图的导航(如示例1中所用)是否比直接读取变量(示例2)更有成本?
非常感谢
发布于 2009-09-06 12:53:38
a.可读性:一个变量只有一个名称比每次都解析它更清晰。
b.可维护性:如果参数名称发生变化,只需更改一个位置。一般来说,最好避免重复即使是简短的表达式。
c.正确性:您可以在第一次获取时检查参数是否有值(即不为空)以及是否在正确的范围内。在此之后,使用您知道正确的变量。此外,如果您需要进行清理(例如,为了避免SQL注入),您可以在一个地方执行。
发布于 2009-09-06 13:12:53
我不认为编译器或JVM能从第一个例子中推断出第二个例子--它必须确定那些调用getParameter()的结果永远不会改变(另一个线程可能会介入并改变它),而且这个方法没有任何副作用。
一般来说,调用一个方法总是会有一些开销,所以你的第二个例子在这个意义上会更快。然而,正如Avi已经建议的,“优化”样式/可读性是选择第二个选项而不是第一个选项的更好的理由。只有当您真的进行了大量调用,或者调用非常昂贵时,优化速度才有意义--在您当前的示例中,这两种情况可能都不是这样。
发布于 2009-09-06 16:23:06
之前的帖子是对的,这是微优化。但是偶尔看一眼还是很有趣的。运行javap只需要一秒钟。
javap -c -classpath . VariableAssignmentTest
public class VariableAssignmentTest extends javax.servlet.http.HttpServlet{
protected void doGet1(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) throws javax.servlet.ServletException, java.io.IOException;
Code:
0: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
3: aload_1
4: ldc #3; //String locale
6: invokeinterface #4, 2; //InterfaceMethod javax/servlet/http/HttpServletRequest.getParameter:(Ljava/lang/String;)Ljava/lang/String;
11: invokevirtual #5; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
14: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
17: aload_1
18: ldc #3; //String locale
20: invokeinterface #4, 2; //InterfaceMethod javax/servlet/http/HttpServletRequest.getParameter:(Ljava/lang/String;)Ljava/lang/String;
25: invokevirtual #5; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
28: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
31: aload_1
32: ldc #3; //String locale
34: invokeinterface #4, 2; //InterfaceMethod javax/servlet/http/HttpServletRequest.getParameter:(Ljava/lang/String;)Ljava/lang/String;
39: invokevirtual #5; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
42: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
45: aload_1
46: ldc #3; //String locale
48: invokeinterface #4, 2; //InterfaceMethod javax/servlet/http/HttpServletRequest.getParameter:(Ljava/lang/String;)Ljava/lang/String;
53: invokevirtual #5; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
56: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
59: aload_1
60: ldc #3; //String locale
62: invokeinterface #4, 2; //InterfaceMethod javax/servlet/http/HttpServletRequest.getParameter:(Ljava/lang/String;)Ljava/lang/String;
67: invokevirtual #5; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
70: return
protected void doGet2(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) throws javax.servlet.ServletException, java.io.IOException;
Code:
0: aload_1
1: ldc #3; //String locale
3: invokeinterface #4, 2; //InterfaceMethod javax/servlet/http/HttpServletRequest.getParameter:(Ljava/lang/String;)Ljava/lang/String;
8: astore_3
9: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
12: aload_3
13: invokevirtual #5; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
16: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
19: aload_3
20: invokevirtual #5; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
23: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
26: aload_3
27: invokevirtual #5; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
30: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
33: aload_3
34: invokevirtual #5; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
37: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
40: aload_3
41: invokevirtual #5; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
44: return
https://stackoverflow.com/questions/1385543
复制相似问题