在c中以编程方式清除缓存
Clearing cache programmaticaly in c
有没有办法只使用C语言从系统中clear/flush所有内存缓存缓存数据(当前程序缓存或所有缓存数据)?
C 标准没有提供完全可移植的刷新缓存的方法。但是,如果您知道缓存的大小并且它是最近最少使用 (LRU) 或伪 LRU 缓存,您可以这样做:
// CacheSize is the number of bytes in cache.
// LineSize is the number of bytes in a cache line (use 1 if unknown).
volatile unsigned char *FlushBuffer = malloc(CacheSize);
if (!FlushBuffer)
ComplainAndExit();
for (size_t i = 0; i < CacheSize; i += LineSize)
FlushBuffer[i];
这将访问分配的缓冲区中的每个缓存行,这将强制逐出之前缓存中的每个行。因为使用了 volatile
,所以 FlushBuffer[i]
需要编译器生成实际的加载指令,而不是优化表达式(如果编译器对什么是内存访问有任何合理的定义)。
在测量函数之前不要释放内存。如果释放它,内存可能会被其他内存分配调用重用,然后函数将使用缓存中已有的内存,这不是您想要的。您应该分配一次缓冲区并在每个要测量的函数之前执行循环,包括第一个函数(以便所有函数都以相同的缓存状态开始)。
有没有办法只使用C语言从系统中clear/flush所有内存缓存缓存数据(当前程序缓存或所有缓存数据)?
C 标准没有提供完全可移植的刷新缓存的方法。但是,如果您知道缓存的大小并且它是最近最少使用 (LRU) 或伪 LRU 缓存,您可以这样做:
// CacheSize is the number of bytes in cache.
// LineSize is the number of bytes in a cache line (use 1 if unknown).
volatile unsigned char *FlushBuffer = malloc(CacheSize);
if (!FlushBuffer)
ComplainAndExit();
for (size_t i = 0; i < CacheSize; i += LineSize)
FlushBuffer[i];
这将访问分配的缓冲区中的每个缓存行,这将强制逐出之前缓存中的每个行。因为使用了 volatile
,所以 FlushBuffer[i]
需要编译器生成实际的加载指令,而不是优化表达式(如果编译器对什么是内存访问有任何合理的定义)。
在测量函数之前不要释放内存。如果释放它,内存可能会被其他内存分配调用重用,然后函数将使用缓存中已有的内存,这不是您想要的。您应该分配一次缓冲区并在每个要测量的函数之前执行循环,包括第一个函数(以便所有函数都以相同的缓存状态开始)。