`
dreamstone
  • 浏览: 289047 次
  • 来自: ...
文章分类
社区版块
存档分类

开启一个新的问题(关于声明变量的性能问题) (问题结束)

阅读更多
在我们编程的过程中经常会遇到这样的问题。
for (int i=0;i<n;i++){
    String str 
= //
}

String str 
= null;
for(int i=0;i<n;i++){
    str 
= //
}



在印象中一直认为方法二的性能好于方法一,但是差距应该很小。但因为一位别人的回文说方法一极大的影响了性能,所以想写个例子证明一下相差很小。例子如下:
public class TestOt {
    
public static void main(String[] args) {
        
long n=1000000000;
        
long start = System.currentTimeMillis();
        test2(n);
        
long end = System.currentTimeMillis();
        System.out.println(end
-start);
    }

    
public static void test1(long n){
        
for (int i=0;i<n;i++){
            String str 
= "";
        }

    }

    
public static void test2(long n){
        String str 
= null;
        
for (int i=0;i<n;i++){
            str 
= "";
        }

    }

}
测试的结果是当n=10亿次的时候差距是1秒,所以说差距应该是很小的,符合我原始的记忆,但是另一个问题来了,测试的结果是
方法一:3300毫秒左右
方法二:4300毫秒左右
结果刚好相反,于是更改方法

public class TestOt {
    
public static void main(String[] args) {
        
long n=1000000000;
        
long start = System.currentTimeMillis();
        test1(n);
        
long end = System.currentTimeMillis();
        System.out.println(end
-start);
    }

    
public static void test1(long n){
        
for (int i=0;i<n;i++){
            String str 
= null;
        }

    }

    
public static void test2(long n){
        String str 
= null;
        
for (int i=0;i<n;i++){
        }

    }

}

结果依旧。

没办法,取得字节码,对比
public class TestOt extends java.lang.Object{
public TestOt();
  Code:
   
0:   aload_0
   
1:   invokespecial   #8//Method java/lang/Object."<init>":()V
   4:   return

public static void test1(int);
  Code:
   
0:   iconst_0
   
1:   istore_1
   
2:   goto    10   
   
5:   aconst_null
   
6:   astore_2
   
7:   iinc    11
   
10:  iload_1   
   
11:  iload_0
   
12:  if_icmplt       5
   
15:  return

public static void test2(int);
  Code:
   
0:   aconst_null
   
1:   astore_1
   
2:   iconst_0
   
3:   istore_2
   
4:   goto    10   
   
7:   iinc    21
   
10:  iload_2   
   
11:  iload_0  
   
12:  if_icmplt       7
   
15:  return
}

结果是感觉还是应该是方法二快,那为什么反而方法一快了1秒左右呢?
不得而知,现在我个人猜测的想法是可能有两种情况:
1,JLS的底层定义决定的,有什么特殊的优化?
2,因为方法二比方法一虽然少了在循环中的部分,但是引用的声明周期反而是更长了,是否因为引用存在造成了方法二的栈操作消耗了大部分时间?
猜想一有待于JLS文档的查阅,我会在有空的时候查询,猜想二正在想办法证明。
看文章的朋友,如果谁了解麻烦指点一下,是我的测试方法写的有问题,还是别的原因,谢谢。

最后:问题已经基本了解了原因,见回复中的讨论,谢谢--daydream 的帮忙。
分享到:
评论

相关推荐

    有问题的程序源码(VB2005)

    标题 "有问题的程序源码(VB2005)" 暗示了这是一个关于Visual Basic 2005(VB2005)编程的问题,其中包含了一个有问题的代码示例。VB2005是Microsoft .NET Framework 2.0的一部分,是一个流行的面向对象的编程环境,...

    关于Linux下alsa录音程序移植出现的奇怪问题.docx

    在Linux系统中,Alsa(Advanced Linux Sound Architecture)是一个用于管理音频硬件的库,它提供了与音频设备交互的接口。本文将深入探讨在Linux环境下,使用Alsa进行录音时遇到的移植问题,以及如何解决这类问题。 ...

    强力打开和结束进程模块源码

    "强力打开和结束进程模块源码" 提供了一种方法来管理和控制操作系统中的进程,这对于理解和优化程序性能、调试或安全管理至关重要。易语言是一种面向对象的、以中文编程的编程语言,它使得编程变得更加直观和易于...

    DSP 编程的关键问题

    例如,在一个突发传输结束后,程序需要为下一个突发做准备,这时通常会采用DMA多帧方式。但是,在实际应用中可能会遇到一些问题: 1. **DMA的同步事件设置**:为了确保数据传输的正确性,DMA的传输同步事件应设置为...

    贪吃蛇游戏解决release崩溃问题

    在本项目中,我们关注的是一个使用C语言在Visual Studio(VS)环境下编写的贪吃蛇游戏。在“贪吃蛇”游戏中,玩家控制一个小蛇移动,通过吃食物来增长蛇的身体长度。当蛇碰到边界或者自己的身体时,游戏结束。在开发...

    C++常见问题解答

    一个典型的C++程序由预处理指令、全局声明、函数定义和主函数(`main()`)组成。预处理指令用于包含必要的头文件,全局声明包括变量和常量的声明,函数定义实现具体的逻辑功能,而主函数是程序的入口点。 10. **什么...

    你必须知道的495个C语言问题(完整版本)

    每个章节如ch12、ch17等可能分别深入探讨以上某一个或几个主题,帮助读者逐步构建全面的C语言知识体系。通过详细阅读和实践这些问题,不仅可以加深对C语言的理解,还能提升解决问题的能力。无论是初学者还是经验丰富...

    c语言编程常见问题解答

    C语言是一种基础且强大的编程语言,广泛应用于系统开发、软件工程、嵌入式系统等多个领域。这份"**C语言编程常见问题解答**"资源旨在帮助初学者和有经验的程序员解决在C语言编程过程中遇到的各种问题。CHM版是...

    aardio编程问题集锦与实战

    - `eval`: 执行一个字符串表达式。 **去除收尾空格的方法:** - 在 aardio 中,可以通过字符串方法来实现去除字符串两端的空白字符。虽然原文中没有提供具体的方法名称,但在其他语言中常见的做法是使用类似`trim()...

    MySQL数据库工程师常见面试题

    隐式游标不需要显式声明,当执行 SELECT INTO 语句时,系统会自动创建一个隐式游标,并将结果集中的第一行数据读入指定的变量中。 #### 问题11:触发器中能否用 COMMIT? 在触发器中使用 COMMIT 是不允许的。...

    LoadRunner常见问题整理

    这段代码首先声明了一个`time_t`类型的变量`t`,然后使用`time`函数获取当前时间,并将其存储在`t`中。接着,使用`lr_message`函数输出当前时间的两种格式:一种是以秒为单位的时间戳形式,另一种是日期时间字符串...

    ecos-matlab-master.zip

    2. **导入ECOS**:在MATLAB环境中,通过`cvx_begin`和`cvx_end`语句来开启和结束一个优化问题的定义,然后在其中指定ECOS作为求解器,例如: ```matlab cvx_begin solver 'ECOS' % ... 定义优化问题 ... cvx_...

    易语言强力打开结束进程模块源码-易语言

    总的来说,“易语言强力打开结束进程模块源码”是一个很好的学习资源,它展示了易语言调用系统API的能力,以及在实际问题中的解决方案。通过对源码的理解和实践,开发者不仅可以提升易语言编程技能,还能深入理解...

    Fortran 2008的最新特点

    Fortran 2008作为Fortran语言的一个重要版本,在2003版本的基础上进行了多方面的改进和扩展,旨在提升程序的性能、可读性和并行计算能力。本文将详细介绍Fortran 2008中的新特性,并对其进行深入分析。 #### 子模块...

    新版C语言面试题面试题库(含答案)共6页.pdf.zip

    标题"新版C语言面试题面试题库(含答案)共6页.pdf.zip"揭示了这是一个关于C语言的面试题集,且包含答案,共有六页内容。这表明这份资料可能是为准备C语言编程岗位面试的人准备的,涵盖了C语言的基础和进阶知识,...

    技术人员面试问题之JAVA篇.doc

    - 当一个线程进入对象的 synchronized 方法后,其他线程无法进入该对象的其他 synchronized 方法,除非该方法结束。 27. **try-finally 语句**: - finally 块的代码总会在 try 或者 catch 结束后执行,无论是否...

Global site tag (gtag.js) - Google Analytics