首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >性能:单变量赋值与对象图导航(Java)

性能:单变量赋值与对象图导航(Java)
EN

Stack Overflow用户
提问于 2009-09-06 12:19:04
回答 3查看 555关注 0票数 0

我的问题是关于访问数据的两种可能方式:

(我的问题是关于java语句的“实际使用”,如下所示,在一个函数中访问数据2-10次。不使用数千次迭代/调用来迭代这类语句。)

代码语言:javascript
运行
复制
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"));

对比

代码语言:javascript
运行
复制
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)更有成本?

非常感谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-09-06 12:53:38

  1. 在性能方面,这看起来像是一个微优化,在方案中真的没有太大的区别。多调用几次getParameter()的时间当然会被网络延迟和其他因素所掩盖。
  2. 具体的时序差异取决于getParameter()的实现-如果它真的对你有影响,你应该用你特定的servlet容器来衡量。
  3. 第二种选择的优势超出了性能:

a.可读性:一个变量只有一个名称比每次都解析它更清晰。

b.可维护性:如果参数名称发生变化,只需更改一个位置。一般来说,最好避免重复即使是简短的表达式。

c.正确性:您可以在第一次获取时检查参数是否有值(即不为空)以及是否在正确的范围内。在此之后,使用您知道正确的变量。此外,如果您需要进行清理(例如,为了避免SQL注入),您可以在一个地方执行。

票数 2
EN

Stack Overflow用户

发布于 2009-09-06 13:12:53

我不认为编译器或JVM能从第一个例子中推断出第二个例子--它必须确定那些调用getParameter()的结果永远不会改变(另一个线程可能会介入并改变它),而且这个方法没有任何副作用。

一般来说,调用一个方法总是会有一些开销,所以你的第二个例子在这个意义上会更快。然而,正如Avi已经建议的,“优化”样式/可读性是选择第二个选项而不是第一个选项的更好的理由。只有当您真的进行了大量调用,或者调用非常昂贵时,优化速度才有意义--在您当前的示例中,这两种情况可能都不是这样。

票数 2
EN

Stack Overflow用户

发布于 2009-09-06 16:23:06

之前的帖子是对的,这是微优化。但是偶尔看一眼还是很有趣的。运行javap只需要一秒钟。

代码语言:javascript
运行
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1385543

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档