我正在尝试编写C#游戏框架,因此这里的性能至关重要。
这是我找到的reference。
问题是,我们怎么知道结构是否仍在CPU缓存中?
如果我们不能,那么什么场景将结构推送到内存缓存。
例如,将一个struct推送到List <>然后再访问它们,它还会在CPU缓存上吗?
几乎所有问题的答案都取决于你的问题,你可以通过调试过程并监视“Debug - > Windows - > Registers”来查看是否存在CPU缓存中的某些内容,您可以在其中查看每个寄存器中加载了哪个内存地址并逐步执行代码,你可以看到什么东西出来了。这是我可以去的。
我建议你使用benchmarking进行微观优化,然后才开始挖掘更低的细节。
我们怎么知道结构是否仍然在CPU缓存上?
不,不需要知道。
如果我们不能,那么什么场景将结构推送到内存缓存。
它将完全处理它,但将在它之后处理。
将结构推送到List <>然后再访问它们,它仍然在CPU缓存上吗?
Push a struct to List<>
是一个内存操作,CPU将执行push
操作,但可能它根本不需要加载它,它只能改变pointer
。但是数据将是partially
或sequentially
加载到CPU缓存,如果CPU以后需要这些数据。
为了通过SOFTWARE优化缓存性能,它被称为Cache-Conscious Data Structure,以制作Pointer Based Data Structures Cache Conscious,这将大大提高性能。我在大约15年前使用C进行了一次测试,它提高了性能,大约提高了70多%,但我现在丢失了这些代码。
您必须首先使用性能工具专业:
实现一个可以满足所有建议的框架是不可能的,就像你引用的example一样,它是逐个案例的。我认为你可以提出一个背景,然后我们继续讨论它。
与内存相比,CPU缓存相当小,其单元仅加载所需数据,然后在处理后立即处理,然后在下一个内存地址中加载下一个数据(如果有),但引用类型可以在其他地方存储NEXT数据,但不能存储NEXT位置这将降低性能以找到它。这就是出现3级缓存的原因,第3缓存将尝试定位第2个数据,然后第1个将从更快的缓存中使用它。
List<T>
是一个引用类型,它将在heap
的不同内存块中托管一个实例,然后使性能更差,但值类型对象使用stack
,它可以将数据保持在一起,然后CPU可以加载它们更快,但你必须指定操作以改善您的情况,它在任何实际项目中并不总是通用的。
实际上,为了提高性能,LINQ
将多种对象转换为值类型structure
,而不是使用class
本身。