gpt4 book ai didi

Java super 调整,几个问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:30:37 25 4
gpt4 key购买 nike

在提出问题之前,请您不要无缘无故地去上关于优化的讲座。
纯粹出于学术性考虑以下问题。

我一直在考虑Java中根(即经常使用并且经常互相访​​问)类之间的访问效率,但这适用于大多数OO语言/编译器。您可以用Java访问某些东西的最快方法(我猜是这样)是静态的最终引用。从理论上讲,由于该引用在加载期间可用,因此,良好的JIT编译器将无需进行任何引用查找即可访问变量,并将对该变量的所有访问直接指向恒定地址。也许出于安全原因,它无论如何都无法正常工作,但请忍受...

假设我已经确定在启动时会遇到一些操作问题或传递一些参数,这意味着我无法拥有静态的最终引用,即使我要麻烦每个类按原样构造另一个类建议使Java类彼此之间具有静态最终引用。我可能不想这样做的另一个原因是……举例来说,我正在提供其中某些类的特定于平台的实现。 ;-)

现在,我有两个明显的选择。我可以使用静态引用(在某些系统集线器类上)让我的类彼此了解,该引用是在构造所有类之后设置的(在此期间,我要求它们不能彼此访问,从而消除了操作顺序上的问题)至少在施工期间)。另一方面,这些类之间可以有实例最终引用,如果我现在要决定整理操作顺序很重要,或者可以让传递arg的人来负责-或更重要的是,这些类的特定于平台的实现,我们希望互相引用。

静态变量意味着您不必查找变量wrt到其所属类的位置,从而节省了一次操作。最后一个变量意味着您不必查找所有值,但它确实属于您的类,因此您可以保存“一个操作”。好吧,我知道我现在真的很在手!

然后,我发生了另外一些事情:我可以拥有静态的最终 stub 类,就像一个古怪的接口(interface),其中每个调用都被归为可以扩展 stub 的“impl”。那么性能下降将是运行这些函数所需的双重函数调用,可能我想您无法再将您的方法声明为final了。我假设如果适本地声明了它们,也许可以将它们内联,然后放弃,因为我意识到我将不得不考虑对“impl”的引用是否可以是静态的,最终的或...。

那么,这三个中哪一个最快? :-)

关于降低频繁访问的开销或什至以其他方式向JIT编译器暗示性能的其他方式,还有其他想法吗?

更新:在对各种事物进行了数小时的测试并阅读了http://www.ibm.com/developerworks/java/library/j-jtp02225.html之后,我发现您通常会在进行调整时看到大多数事物,例如C++与JIT编译器完全合为一体。我已经看到它一次,两次运行30秒的计算,而在第三次(以及随后的)运行中,决定“嘿,您没有读取该计算的结果,所以我没有运行它!”。

FWIW您可以测试数据结构,并且我能够使用微基准测试开发一个满足我的需求性能更高的arraylist实现。访问模式必须足够随机,以使编译器能够猜测,但是仍然可以解决如何使用我更简单,更优化的代码更好地实现通用化的增长数组。

就这里的测试而言,我根本无法获得基准测试结果!我从最终对象引用与非最终对象引用中调用函数并读取变量的简单测试揭示了有关JIT的更多信息,而不是JVM的访问模式。令人难以置信的是,在方法中不同位置的同一对象上调用同一函数将使时间花费四分之一!

正如IBM文章中所说的那样,测试优化的唯一方法是就地测试。

感谢所有在整个过程中指出我的人。

最佳答案

值得注意的是,静态字段存储在每个类的特殊对象中,该对象包含该类的静态字段。使用静态字段代替对象字段可能不会更快。

关于Java super 调整,几个问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5193740/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com