64位CLR能使用压缩指针吗?

3
我在一些64位Java虚拟机实现中读到了一些关于压缩对象指针的内容。据我所理解,其原理是将一个引用作为相对于另一个对象的32位地址偏移量存储,而不是完整的64位指针,以节省内存。
我认为,目前这种优化方式并未应用于.NET CLR中。至少我没有找到相关资料。它是否有可能被应用于.NET CLR,或者因CLR内部工作方式而无法进行/无用/导致性能下降呢?

2
在.NET中,这是相当无意义的,只需将平台目标设置为x86即可。运行在64位模式下的唯一目的就是突破2GB虚拟内存限制。使用压缩指针完全违背了这个目的。 - undefined
3
我不同意。有一些方式可以实现压缩指针,允许使用高达32GB(或更多)的内存,因此具有价值。性能提升也是有价值的。(当然,在当前的CLR中这一切都是假设。) - undefined
1
@HansPassant 我相信你对压缩指针的工作方式有误解。通过假设指针在8字节边界上对齐,地址可以通过右移3位来使用32位指针引用高达32GB进程空间中的位置。CLR可以利用压缩指针来进行对象引用,但原始指针和对基本数组中的数组元素的引用则需要完整指针。这种情况似乎可以在运行时实现。 - undefined
当然,在某些情况下,它会提高性能。例如,看一下x32 ABI的基准测试,你会发现由于较小的指针而导致的性能提升,可能会减少缓存未命中。程序中使用的指针越多,节省的内存就越多,性能也就越好。 - undefined
2个回答

0
CLR目前不使用压缩指针。可能CLR的收益没有Java那么大,因为.NET在很大程度上依赖结构体来保持分配低。
.NET与本地代码有很多接口,4字节或8字节对齐指针的冗余位可以用于标记对象固定,以及其他状态标志(注意,目前尚未像这样实现,可能是因为实现起来非常困难)。

-4
虽然我不确定在.NET中是否可以做这样的事情,但64位机器通常有大量的内存(一般为4或8G),所以节省几个4字节不会产生太大影响。我会将其归类为“不是很有用”。
快速搜索并没有显示出.NET能够支持(甚至对指针压缩/ORA感兴趣)的迹象。

3
我不同意。虽然可能没有64位CLR,但如果有的话采用压缩对象指针仍然会有价值。64位模式下拥有额外的8个寄存器和更好的缓存效率是主要原因。 - undefined
2
为了突出“更好的缓存效率”:L2缓存有几兆字节,而缓存之外的内容需要大约100个周期才能访问。 - undefined
3
我曾看到真实世界中的应用程序通过利用压缩对象表示法使用了40%更少的内存。当你谈论一个在拥有16GB物理内存的系统上以“完整”64位模式运行并使用20GB内存的应用程序时,性能收益是非常非常真实的。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接