gpt4 book ai didi

java - 避免在 Java 中缓存未命中

转载 作者:搜寻专家 更新时间:2023-10-31 08:22:34 24 4
gpt4 key购买 nike

目前我正在改变我的心态,开发对缓存更友好的应用程序。
在 C++ 中,我尽可能地使用堆栈分配,我也在一个数组中保存具有相同目的的数据(数据驱动编程)等...
但我也是 Java 开发人员,有一个问题:
我听说 Java 是“缓存未命中生成器”。
所有东西都在堆中,在分配或垃圾收集器工作后分散在整个 RAM 中。我认为 C# 也有同样的问题。
用 Data Driven 的方式写 Java 有意义吗?
有什么方法可以优化 Java 代码,或者我们被 Java 自动优化和缓存未命中所困?

最佳答案

In C++ im using stack allocation where i can,also i'm holding data with this same purpose in one array(Data Driven Programming) etc...

在 Java 中,它会使用 Escape Analysis 自动将短期 Activity 对象放入堆栈。除非您在探查器中看到这是一个问题,否则我不会担心这个。即使那样,分析器也可能阻止逃逸分析工作,这在实际程序中不是问题。

I heard that Java is "cache miss generator".

Java 比 C++ 或 C# 代码具有更多的引用,这些代码是为使用嵌入在对象中的结构或对象而编写的。这有多大差异取决于您的应用程序对微调的敏感程度。

Everything there is in heap,and is scattered in whole RAM after allocation or garbage collector work.I think the same problem is with C#.

Java(和 C#)也不是随机内存排列器。理论上,这些对象可以在任何地方,但实际上它们通常不会。考虑一下你是否有;

class A { }

class B {
A a = new A();
}

如果您创建一个BA 可以在任何地方,但通常不是。 Java 在 Eden 空间分配内存时,它通常在内存中是连续的。这是分配内存的最简单和最有效的方法。这意味着 99.9% 的时间,A 将紧跟在 B 之后,可能在同一缓存行上。事实上,对于某些用例,“虚假共享”是 Java 中的一个真正问题。即当您想要两个不在同一缓存行上的对象时。

GC 上发生了什么?

在 OpenJDK/Oracle JVM 中,对象的复制顺序与发现的顺序相反。即在大多数情况下,A 会紧接在 B 之前出现。

Will it have sense to write Java in Data Driven way?

在这种情况下,在 < 1% 的情况下,这会产生很大的不同。然而,对于您的大部分代码,如果不是您的大部分应用程序,您将有很多很多的问题需要担心。

Is there any way to optimize Java code,or we are stuck with Java automatic optimization and cache misses?

您可以使用Unsafe 来控制您选择的内存结构。我们(Chronicle Software)拥有允许您这样做的库,但即使我们希望您使用我们的服务,但在 99% 的情况下,没有充分的理由担心这种微调。只有在极端情况下才会产生真正的影响。

I dont want modify garbage collector.But i know it copies everything around so it messes a bit structure.I want avoid this as much as i can.

这就是 GC 所做的。它将相关对象打包在一起,不仅是为了提高效率,而且因为以找到它们的方式复制对象是最简单的实现。随机排列数据是您必须故意做的事情,如果您愿意的话,这会带来更多工作。例如如果你想避免“虚假分享”,这很重要。

关于java - 避免在 Java 中缓存未命中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30598402/

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