字符串vs字节数组,性能

本文关键字:性能 数组 字节数 vs 字节 字符串 | 更新日期: 2023-09-27 18:12:07

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

我最近在一个论坛上看到(我想他们是在讨论Java),如果你必须解析大量的字符串数据,最好使用字节数组而不是带有split()的字符串。确切的帖子是:

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

现代的CPU比它们的内存快得多。他们拖延了很多时间,每次缓存丢失需要多个周期,大多数CPU传输预算都是如此通过分配大缓存和大量tick来减少此问题。

GPU解决这个问题的方式不同,有很多线程准备执行以隐藏内存访问延迟,并且很少或没有缓存和把晶体管花在更多的核上。

所以,例如,不是使用String's和split来解析a消息时,使用可以就地更新的字节数组。你真的想要为了避免对大型数据结构的随机内存访问,至少在内循环

他只是说"不要使用字符串,因为他们是一个对象和创建对象是昂贵的"?或者他在说别的什么?

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

字符串vs字节数组,性能

他的意思是,如果你把大块文本分解成单独的字符串对象,这些字符串对象的局部性比大数组文本更差。每个字符串,以及它所包含的字符数组,都会在内存中的其他地方;它们可以散布在任何地方。在处理数据时,内存缓存很可能必须进进出出来访问各种字符串。相比之下,一个大数组具有最好的局部性,因为所有数据都在一个内存区域上,并且缓存抖动将保持在最低限度。

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

在高频交易中使用byte[]char*而不是字符串还有很多其他原因。字符串在Java中由16位char组成,并且是不可变的。byte[]ByteBuffer易于回收,具有良好的缓存位置,可以离开堆(直接)保存副本,避免字符编码器。这一切都假定您使用的是ASCII数据。

char*或ByteBuffers也可以映射到网络适配器以保存另一个副本。(对ByteBuffers进行一些调整)

在高频交易中,你很少一次处理大量数据。理想情况下,您希望在数据从套接字下发后立即进行处理。即一次一个包。(约1.5 KB)