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[]
的内容是否更快A=sum(B,C)
是否比A=B+C
慢?假设sum(x,y){returnx+y}
(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个浮动通常会一样快或更快。至于是否真的重要,应该用一个分析器来确定。如果我们不考虑优化器,那么一个快速问题(相当一个疑问)是内联会更快,因为堆栈操作(函数调用和返回)将花费时间(再次考虑数百万的紧循环)。因为作者没有提到优化器!