我们怎么知道 struct 是在 CPU 缓存中还是丢失到内存缓存中了?
How can we know if struct is on CPU cache or lost them to memory cache?
我正在尝试编写 C# 游戏框架,因此性能在这里很关键。
这是我找到的 reference。
问题是,我们如何知道结构是否仍在 CPU-缓存中?
如果我们不能,那么在什么情况下将结构推送到内存缓存。
例如,将结构推送到 List<> 然后稍后访问它们,它还会在 CPU-缓存上吗?
你问题的几乎所有答案都取决于它,但是你可以通过调试进程和监控 "Debug -> Windows -> Registers" 来查看 CPU 缓存中是否有内容在那里你可以看到哪个内存地址被加载到每个寄存器并逐步执行代码你可以看到什么东西进出。我能做到的就这些。
我建议您使用 benchmarking 进行微优化,然后才开始挖掘更底层的细节。
How can we know if structs are still on the CPU-cache?
不,没必要知道。
If we can't, Then what scenarios pushing structs to memory-cache.
它会在处理它时准确存在,但会在它之后被处理掉。
Push a struct to List<> then access them later, Will it still be on CPU-cache?
Push a struct to List<>
是内存操作,CPU会做push
操作,但可能根本不需要加载,改成[=12就可以了=] 只有。但如果 CPU 稍后需要这些数据,数据将被 partially
或 sequentially
加载到 CPU-缓存。
通过SOFTWARE优化缓存性能,叫做Cache-Conscious Data Structure, to make Pointer Based Data Structures Cache Conscious,可以大大提高性能。大约 15 年前我用 C 做了一个测试,它提高了性能,大约 70+% 以上,但我现在丢失了那些代码。
首先你必须专业使用性能工具:
- Visual studio performance tools 为您提供了识别代码的哪一部分在任何级别消耗性能的通用方法。
- 这个postValue Types vs Reference Types provides an great example on Benchmark Runner
不可能实现一个可以满足所有建议的框架,就像 example 你引用的那样,这是个案。我觉得你可以放个上下文,我们再继续讨论。
CPU cache 相对于内存来说比较小,它的单元只加载需要的数据,处理完后立即处理,如果有的话在下一个内存地址加载下一个数据,但是引用类型可以存储NEXT 数据在其他地方,但不是 NEXT 位置,这会降低定位 it.That 出现 3 级缓存的原因,第 3 级缓存将尝试为第 2 级定位数据,然后第 1 级将从更快的缓存中使用它.
List<T>
是引用类型,会在一个heap
的不同内存块中承载一个实例,那么性能会差一点,但是值类型对象使用stack
,这可以将数据放在一起,然后 CPU 可以更快地加载它们,但是您还必须指定操作来改进您的情况,它在任何实际项目中并不总是通用的。
实际上,为了提高性能,LINQ
将多种对象转换为值类型 structure
,而不是继续使用 class
本身。
我正在尝试编写 C# 游戏框架,因此性能在这里很关键。
这是我找到的 reference。
问题是,我们如何知道结构是否仍在 CPU-缓存中?
如果我们不能,那么在什么情况下将结构推送到内存缓存。
例如,将结构推送到 List<> 然后稍后访问它们,它还会在 CPU-缓存上吗?
你问题的几乎所有答案都取决于它,但是你可以通过调试进程和监控 "Debug -> Windows -> Registers" 来查看 CPU 缓存中是否有内容在那里你可以看到哪个内存地址被加载到每个寄存器并逐步执行代码你可以看到什么东西进出。我能做到的就这些。
我建议您使用 benchmarking 进行微优化,然后才开始挖掘更底层的细节。
How can we know if structs are still on the CPU-cache?
不,没必要知道。
If we can't, Then what scenarios pushing structs to memory-cache.
它会在处理它时准确存在,但会在它之后被处理掉。
Push a struct to List<> then access them later, Will it still be on CPU-cache?
Push a struct to List<>
是内存操作,CPU会做push
操作,但可能根本不需要加载,改成[=12就可以了=] 只有。但如果 CPU 稍后需要这些数据,数据将被 partially
或 sequentially
加载到 CPU-缓存。
通过SOFTWARE优化缓存性能,叫做Cache-Conscious Data Structure, to make Pointer Based Data Structures Cache Conscious,可以大大提高性能。大约 15 年前我用 C 做了一个测试,它提高了性能,大约 70+% 以上,但我现在丢失了那些代码。
首先你必须专业使用性能工具:
- Visual studio performance tools 为您提供了识别代码的哪一部分在任何级别消耗性能的通用方法。
- 这个postValue Types vs Reference Types provides an great example on Benchmark Runner
不可能实现一个可以满足所有建议的框架,就像 example 你引用的那样,这是个案。我觉得你可以放个上下文,我们再继续讨论。
CPU cache 相对于内存来说比较小,它的单元只加载需要的数据,处理完后立即处理,如果有的话在下一个内存地址加载下一个数据,但是引用类型可以存储NEXT 数据在其他地方,但不是 NEXT 位置,这会降低定位 it.That 出现 3 级缓存的原因,第 3 级缓存将尝试为第 2 级定位数据,然后第 1 级将从更快的缓存中使用它.
List<T>
是引用类型,会在一个heap
的不同内存块中承载一个实例,那么性能会差一点,但是值类型对象使用stack
,这可以将数据放在一起,然后 CPU 可以更快地加载它们,但是您还必须指定操作来改进您的情况,它在任何实际项目中并不总是通用的。
实际上,为了提高性能,LINQ
将多种对象转换为值类型 structure
,而不是继续使用 class
本身。