首页 > 解决方案 > 在 c 中以编程方式清除缓存

问题描述

有没有办法仅使用 C 语言从系统中清除/刷新所有内存缓存缓存数据(当前程序缓存或所有缓存数据)?

标签: ccaching

解决方案


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]需要编译器生成实际的加载指令,而不是优化表达式(如果编译器对内存访问有任何合理的定义)。

在测量函数之前不要释放内存。如果你释放它,内存可能会被其他内存分配调用重用,然后函数将使用缓存中已经存在的内存,这不是你想要的。您应该分配一次缓冲区并在每个要测量的函数之前执行循环,包括第一个函数(以便所有函数都以相同的缓存状态开始)。


推荐阅读