C# · 12月 23, 2021

c# – 字符串与字节数组,性能

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

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

One performance trick to working with any language,C++,Java,C# is
to avoid object creation. It’s not the cost of allocation or GC,its
the cost to access large memory arrays that dont fit in the cpu cache.

Modern cpu’s are much faster than their memory. They stall for many,
many cycles for each cache miss. Most of the cpu transister budget is
allocated to reduce this with large caches and lots of ticks.

GPU’s solve the problem differently by having lots of threads ready to
execute to hide memory access latency and have little or no cache and
spend the transistors on more cores.

So,for example,rather than using String’s and split to parse a
message,use byte arrays that can be updated in place. You really want
to avoid random memory access over large data structures,at least in
the inner loops.

他只是说“不要使用字符串,因为它们是一个对象,创建对象是昂贵的”?还是他说别的?

使用字节数组确保数据保持在缓存中尽可能长吗?
当你使用一个字符串是太大,不能被保存在cpu缓存中?
一般来说,使用原始数据类型编写更快的代码的最佳方法?

解决方法 他说如果你将一个块文本分割成单独的字符串对象,那么这些字符串对象的位置要比大量的文本更差.每个字符串及其包含的字符数组将会在内存中的其他位置;他们可以遍布整个地方.在处理数据时,内存缓存很可能不得不进入和退出以访问各种字符串.相比之下,一个大阵列具有最佳可能的位置,因为所有的数据都在一个内存区域,高速缓存冲击将被保持在最低限度.

当然这是有限制的:如果文本非常非常大,并且只需要解析出它的一部分,那么这些几个小的字符串可能比缓冲区中的大块文本更适合.