在托管代码中,如何实现良好的引用位置?
由于RAM似乎是新磁盘,并且由于该语句还意味着对内存的访问现在被认为是缓慢的,类似于磁盘访问一直以来的方式,因此我确实希望最大化高性能应用程序在内存中的引用位置。例如,在排序索引中,我希望相邻值接近(与哈希表中不同),并且我也希望索引指向的数据接近。
在C语言中,我可以用专门的内存管理器来构建数据结构,就像(非常复杂)Judy数组的开发人员所做的那样。通过直接控制指针,它们甚至在指针值本身中对其他信息进行编码。在Python,Java或C#中工作时,我故意将一个(或多个)抽象级别与这种类型的解决方案分开,并且我委托JIT编译器并优化运行时,在低级别上为我做聪明的把戏。
不过,我想,即使在这种高度抽象的情况下,也有一些东西在语义上可以被认为是“更接近”的,因此在低层次上实际上可能更接近。例如,我想知道以下内容(我在括号中的猜测):
- 我可以期望数组是相邻的内存块吗(是)?
- 同一实例中的两个整数是否比同一类的不同实例中的两个整数更接近(可能)?
- 对象是否占用内存中的连续区域(否)?
- 只有两个字段的对象数组和具有两个字段的单个对象之间有什么区别?(此示例可能是特定于 Java 的)
int
int[]
我开始在Java上下文中思考这些问题,但我的疑惑已经变得更加普遍,所以我建议不要将其视为Java问题。