字符串与字节数组,性能

use*_*112 10 c# c++ java oop

(这篇文章是关于高频类型编程)

我最近在一个论坛(我认为他们正在讨论Java)上看到,如果你必须解析大量的字符串数据,那么使用字节数组比使用split()的字符串更好.确切的帖子是:

使用任何语言,C++,Java,C#的一个性能技巧是避免对象创建.这不是分配或GC的成本,而是访问不适合CPU缓存的大型内存阵列的成本.

现代CPU比它们的内存快得多.对于每个高速缓存未命中,它们会停止许多周期.大多数CPU转置预算都是通过大缓存和大量滴答来分配的.

GPU通过准备执行大量线程来隐藏内存访问延迟并且几乎没有缓存并将晶体管花费在更多内核上,从而以不同方式解决问题.

因此,例如,不是使用String和split来解析消息,而是使用可以就地更新的字节数组.你真的想避免在大型数据结构上进行随机内存访问,至少在内部循环中是这样.

他只是说"不要使用字符串,因为它们是一个对象并且创建对象是昂贵的"?还是他说了别的什么?

使用字节数组是否确保数据尽可能长时间保留在缓存中?当你使用字符串时它是否太大而无法保存在CPU缓存中?一般来说,使用原始数据类型是编写更快代码的最佳方法吗?

Ern*_*ill 11

他说如果你把一个块文本分成单独的字符串对象,那些字符串对象的位置比大文本更糟.每个字符串及其包含的字符数组将在内存中的其他位置; 它们可以遍布各处.在处理数据时,内存缓存很可能需要进出才能访问各种字符串.相比之下,一个大型阵列具有最佳可能的位置,因为所有数据都在一个内存区域上,并且高速缓存抖动将保持最小.

当然,这有一些限制:如果文本非常非常大,而你只需要解析其中的一部分,那么那些少数小字符串可能比大块文本更适合缓存.