字符串vs字节数组,性能
String vs byte array, Performance
(这篇文章是关于高频类型编程的)
我最近在一个论坛上看到(我想他们是在讨论Java),如果你必须解析大量的字符串数据,最好使用字节数组而不是带有split()的字符串。确切的帖子是:
使用任何语言,c++, Java, c#的一个性能技巧是避免对象创建。这不是分配或GC的成本,而是访问不适合CPU缓存的大型内存数组的成本。
现代的CPU比它们的内存快得多。他们拖延了很多时间,每次缓存丢失需要多个周期,大多数CPU传输预算都是如此通过分配大缓存和大量tick来减少此问题。
GPU解决这个问题的方式不同,有很多线程准备执行以隐藏内存访问延迟,并且很少或没有缓存和把晶体管花在更多的核上。
所以,例如,不是使用String's和split来解析a消息时,使用可以就地更新的字节数组。你真的想要为了避免对大型数据结构的随机内存访问,至少在内循环
他只是说"不要使用字符串,因为他们是一个对象和创建对象是昂贵的"?或者他在说别的什么?
使用字节数组确保数据在缓存中保持尽可能长的时间吗?当您使用字符串时,它是否太大而无法在CPU缓存中保存?一般来说,使用原始数据类型是编写更快代码的最佳方法吗?
他的意思是,如果你把大块文本分解成单独的字符串对象,这些字符串对象的局部性比大数组文本更差。每个字符串,以及它所包含的字符数组,都会在内存中的其他地方;它们可以散布在任何地方。在处理数据时,内存缓存很可能必须进进出出来访问各种字符串。相比之下,一个大数组具有最好的局部性,因为所有数据都在一个内存区域上,并且缓存抖动将保持在最低限度。
当然,这是有限制的:如果文本非常非常大,而您只需要解析其中的一部分,那么这些小字符串可能比大块文本更适合缓存。
在高频交易中使用byte[]
或char*
而不是字符串还有很多其他原因。字符串在Java中由16位char
组成,并且是不可变的。byte[]
或ByteBuffer
易于回收,具有良好的缓存位置,可以离开堆(直接)保存副本,避免字符编码器。这一切都假定您使用的是ASCII数据。
char*
或ByteBuffers也可以映射到网络适配器以保存另一个副本。(对ByteBuffers进行一些调整)
在高频交易中,你很少一次处理大量数据。理想情况下,您希望在数据从套接字下发后立即进行处理。即一次一个包。(约1.5 KB)
- 介于 [固定数组] 和 [带内存分配的指针] 之间的性能
- 数组中的不同浮点值会影响性能 10 倍 - 为什么?
- 一维数组映射方式的性能差异问题
- 将类成员数组组合到单个数组时性能下降
- 提高访问大型数组元素的性能
- 使用数组时的抽象与性能
- 为什么这个普通的数组实现比STD ::向量实现性能慢
- C 初始化列表std ::数组最佳性能
- 数组的正确值将提高性能
- std ::数组与数组性能
- 将特征矩阵转换为 c 数组以便我可以使用 gsl 的性能高效方法是什么
- C++中使用大型数组时的性能问题
- C++-静态数组的性能,在启动时具有可变大小
- 在性能方面,我应该更喜欢数组而不是矢量吗
- 数组的结构和结构数组 - 性能差异
- 为什么 std::vector 比本机数组的性能更高
- C++数组与矢量性能测试说明
- 性能问题C++ - 搜索数组
- 数组和过滤性能
- 在将 char 数组复制到字符串期间节省 CPU 周期(提高性能)