Java 关于做大量计算的三个问题

Java 关于做大量计算的三个问题,java,android,performance,algorithm,computation,Java,Android,Performance,Algorithm,Computation,这只是一系列关于做大量计算的问题。要么我在网上找不到答案,要么我还需要澄清 将(float,float,float)作为方法参数传递比将(float[])作为数组有三个术语传递快吗 方法返回float[]vs设置作为参数传递给方法的float[]的内容是否更快 用实际计算代替方法调用是否更快,即代替IsA=sum(B,C)是否比A=B+C慢?假设sum(x,y){returnx+y} 编辑: 谢谢你们的回答,伙计们!在我结束这篇文章之前,如果有人知道,我还有一个简短的问题: 如果我使用一个类反复

这只是一系列关于做大量计算的问题。要么我在网上找不到答案,要么我还需要澄清

  • (float,float,float)
    作为方法参数传递比将
    (float[])
    作为数组有三个术语传递快吗

  • 方法返回
    float[]
    vs设置作为参数传递给方法的
    float[]
    的内容是否更快

  • 用实际计算代替方法调用是否更快,即代替Is
    A=sum(B,C)
    是否比
    A=B+C
    慢?假设
    sum(x,y){returnx+y}

  • 编辑:

    谢谢你们的回答,伙计们!在我结束这篇文章之前,如果有人知道,我还有一个简短的问题:

  • 如果我使用一个类反复计算相同的统计数据(然后将它们扔掉),那么创建实例变量作为容器以避免连续的重新分配和取消分配会更好吗
  • 1) 将(float,float,float)作为方法参数传递是否更快 (float[])其中数组有三个项

    1.)视情况而定。如果单独的浮点在内存中不连续,则浮点[]可能会有所帮助

    2) 方法返回float[]比设置 作为参数传递给方法的浮点[]的内容

    2.)取决于两种情况下是否已经存在浮点[]。如果您创建一个新的float[]并将其传入,或者创建一个新的float[]并返回它,那么成本是相同的。但是,如果在任何一种情况下,您都可以以某种方式使用现有的float[],这将更快,并创建更少的分配

    3) 用实际计算替换方法调用是否更快 i、 e.A=sum(B,C)是否比A=B+C慢?假设 和(x,y){返回x+y}

    3.)我不确定,我更像是一个C#程序员。我知道,在基本CLR(公共语言运行库)上,就像Xbox360在运行C#时使用的那样,手动计算要比使用重载方法便宜得多。我不确定Java在任何平台上是否存在类似的问题

    (float,float,float)
    作为方法参数与
    (float[])
    数组中有三个术语的位置

    那要看情况。如果你已经准备好了浮动数组,那么它不会有任何区别。如果您每次都在构造数组,那么将需要一些时间来分配给数组,并且可能需要一些时间来构造数组

    这有关系吗?如果您在一个连续执行数百万次的紧密循环中执行它,并且在应用程序生命周期中执行了很多次,那么它肯定会执行

    方法返回float[]比设置内容快吗 作为参数传递给方法的浮点[]的值

    如果每次都需要为返回值构造浮点数组,那么这肯定不会比在预先存在的数组中设置值快。 这仅仅是因为两个选项都涉及到设置值,而其中一个选项有创建新数组的额外任务。但是创建一个新阵列可能非常非常快

    尽管如此,如果你在你的应用程序中快速连续地做了数百万次,对它进行基准测试,它可能会为你节省一些时间

    用实际计算替换方法调用是否更快。 而不是
    A=sum(B,C)
    A=B+C
    慢多少?假设
    sum(x,y){返回x+y}

    几乎不可能说。内置热点代码优化器非常擅长发现这些东西,并为您的用户优化它们

    如果您对此进行基准测试,请尝试将
    sum
    方法
    private
    ,这将使HotSpot更容易决定它是否可以内联(尽管如果您没有任何覆盖的
    sum
    方法的实现,HotSpot本身也会发现这一点)


    这里关于基准测试的一点是:

    它现在可能会帮助您的应用程序使用当前版本的VM(以及当前的代码库)。如果您决定升级到新版本的VM,您可能会发现性能特征发生了变化,您可能需要再次进行优化

    所以,只有当它对您的应用程序真的很重要时才去做,否则可能会浪费精力


    最好先关注算法及其空间和时间复杂性;任何好处都是永远的好处。

    这些微优化不会在任何规模上产生任何影响。@Kon但他说的是一部手机和大量的计算。“我不会在PC JVM上担心它,但对adroid不太确定。”KevinXu问得好。我也有兴趣了解这些事情。让我们看看这里的专家是怎么说的。@AhmadNawaz-最好的办法是自己分析性能,比较不同选择的速度。#1可能在64位的uber微尺度上是正确的,如果没有内联的话,注册与缓存是重要的,主要是因为3个浮点数可以简单地从一个寄存器传递到另一个寄存器,而不会溢出。我不知道有哪一个优化器会在后一种情况下这样做,所以#1可以肯定地说,通过3个浮动通常会一样快或更快。至于是否真的重要,应该用一个分析器来确定。如果我们不考虑优化器,那么一个快速问题(相当一个疑问)是内联会更快,因为堆栈操作(函数调用和返回)将花费时间(再次考虑数百万的紧循环)。因为作者没有提到优化器!