(这篇帖子是关于高频类型编程的)
我最近在一个论坛上看到(我想他们正在讨论Java),如果你必须解析大量的字符串数据,最好使用字节数组而不是使用split()函数的字符串。确切的帖子内容如下:
“与任何语言,包括C++、Java、C#一起工作的性能技巧之一是避免对象创建。这不是分配或GC的成本,而是访问不适合CPU缓存的大型内存数组的成本。
现代CPU比它们的内存快得多。对于每个缓存未命中,它会停滞很多很多个周期。大部分CPU晶体管预算都被分配用来减少这种情况,采用大型缓存和大量时钟。
GPU通过准备大量线程来隐藏内存访问延迟并且几乎没有缓存,并将晶体管花费在更多的核心上来以不同的方式解决问题。
因此,例如,与其使用String和split来解析消息,不如使用可以原地更新的字节数组。你真的想要避免在大型数据结构中进行随机内存访问,至少在内部循环中。”
他是在说“不要使用字符串,因为它们是对象,创建对象会很耗费资源”吗?还是他在说别的什么?
使用字节数组是否能确保数据在缓存中尽可能长时间地保留? 当您使用字符串时,它是否太大而无法保存在CPU缓存中? 通常来说,使用基本数据类型是编写更快代码的最佳方法吗?
我最近在一个论坛上看到(我想他们正在讨论Java),如果你必须解析大量的字符串数据,最好使用字节数组而不是使用split()函数的字符串。确切的帖子内容如下:
“与任何语言,包括C++、Java、C#一起工作的性能技巧之一是避免对象创建。这不是分配或GC的成本,而是访问不适合CPU缓存的大型内存数组的成本。
现代CPU比它们的内存快得多。对于每个缓存未命中,它会停滞很多很多个周期。大部分CPU晶体管预算都被分配用来减少这种情况,采用大型缓存和大量时钟。
GPU通过准备大量线程来隐藏内存访问延迟并且几乎没有缓存,并将晶体管花费在更多的核心上来以不同的方式解决问题。
因此,例如,与其使用String和split来解析消息,不如使用可以原地更新的字节数组。你真的想要避免在大型数据结构中进行随机内存访问,至少在内部循环中。”
他是在说“不要使用字符串,因为它们是对象,创建对象会很耗费资源”吗?还是他在说别的什么?
使用字节数组是否能确保数据在缓存中尽可能长时间地保留? 当您使用字符串时,它是否太大而无法保存在CPU缓存中? 通常来说,使用基本数据类型是编写更快代码的最佳方法吗?