Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 实例和迭代。哪一个更好?_Java_Performance_Iteration_Instantiation - Fatal编程技术网

Java 实例和迭代。哪一个更好?

Java 实例和迭代。哪一个更好?,java,performance,iteration,instantiation,Java,Performance,Iteration,Instantiation,我想阅读文件并处理它们。每个迭代处理一个文档 哪种代码更好 一, 二, 我的观点是,哪一个在空间和速度方面更有效?如果不在其他地方使用br变量,它们完全相同 小心不要浪费太多时间尝试纳米优化。即使字节码不同,JIT在优化代码时也不是那么糟糕。您不需要在使用变量的块之前声明变量,也不应该这样做,因为它使变量的用途变得不那么清楚。在我看来,后者更清楚。一般来说,您更喜欢使用最小的作用域来声明局部变量,理想的情况是在声明时初始化它们 它不会直接影响性能,但会影响可读性和维护性,这会影响您进行更改的难易

我想阅读文件并处理它们。每个迭代处理一个文档

哪种代码更好

一,

二,


我的观点是,哪一个在空间和速度方面更有效?

如果不在其他地方使用
br
变量,它们完全相同


小心不要浪费太多时间尝试纳米优化。即使字节码不同,JIT在优化代码时也不是那么糟糕。您不需要在使用变量的块之前声明变量,也不应该这样做,因为它使变量的用途变得不那么清楚。

在我看来,后者更清楚。一般来说,您更喜欢使用最小的作用域来声明局部变量,理想的情况是在声明时初始化它们

它不会直接影响性能,但会影响可读性和维护性,这会影响您进行更改的难易程度,从而影响性能

一般而言:

  • 制定您的绩效和行为要求(以及如何测试两者)
  • 编写最简单、最干净的代码,实现您想要的行为
  • 看看它是否符合您的性能要求
  • 如果没有,分析问题所在,并做出“最不干净”的改变以改善情况。(这可能意味着进行设计更改,而不是进行微观优化。)
  • 起泡、冲洗、重复,直到得到满足性能要求且尽可能干净的代码
  • 它们完全相同,在编译成字节码后,所有差异都会丢失
  • 即使我们设想最坏的情况,理论上(在另一个Java中)可能相当于一次额外的内存写入,差异也会非常小,以至于需要世界上最精确的原子钟来测量它
  • 对于您来说,真正的区别应该在于代码的总体可维护性,这应该比速度低于2-3%的实际差异更值得关注。例如,许多设计模式都会引入某种开销,但人们更愿意为它给代码基础带来的灵活性而付出代价

  • 在代码优化中,很容易陷入小赢大输的陷阱:每个方法都可能被优化到完美,但由于全局架构的不足,整体系统性能可能仍然是一场灾难。必须始终自上而下进行优化,这样做时,您会发现,如果用优化版本替换,实际上只有1%或更少的代码行可以提高总体性能。

    从效率角度看,两者都是相同的,大多数情况下都编译成类似的字节码


    可读性方面,第二种方法更好。通常,当代码增长时,它会有很大帮助。特别是在调试时,您不必担心稍后在该块之外修改该变量。

    唯一的区别是
    br
    第二种情况是循环范围内的局部变量,而第一种情况下,它可以在循环外访问。但请注意,即使在第一种情况下,
    br
    ref变量也会在outaide循环中可用,而不是在for循环中提供的值

    否则他们就一模一样了。尽管第二种情况更具可读性

    3

    for(File f : files)
    {
        try( BufferedReader br = new BufferedReader(......) )
        {
            ......
        }
    }
    

    @FedericoCristina标题更新(y)打印此答案并将其挂在我的隔间中。如果我回忆正确,1)不正确:
    br
    在第二个示例中循环结束后,一旦离开定义的范围,将不再定义它。这使得维护更容易,因为您不会意外地重用变量。@izkata 1)与维护的差异无关,而是与运行时效率有关。编译器很容易检测到
    br
    的使用以
    for
    循环结束,并将其视为在内部声明。
    for(File f : files)
    {
        BufferedReader br = new BufferedReader(......);
        ......
    }
    
    for(File f : files)
    {
        try( BufferedReader br = new BufferedReader(......) )
        {
            ......
        }
    }