c - 在 c 中以编程方式清除缓存
问题描述
有没有办法仅使用 C 语言从系统中清除/刷新所有内存缓存缓存数据(当前程序缓存或所有缓存数据)?
解决方案
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]
需要编译器生成实际的加载指令,而不是优化表达式(如果编译器对内存访问有任何合理的定义)。
在测量函数之前不要释放内存。如果你释放它,内存可能会被其他内存分配调用重用,然后函数将使用缓存中已经存在的内存,这不是你想要的。您应该分配一次缓冲区并在每个要测量的函数之前执行循环,包括第一个函数(以便所有函数都以相同的缓存状态开始)。
推荐阅读
- graphql - graphql - 参考突变中的其他字段
- flutter - 将数据从另一个类导入到 Stateful Widget
- javascript - 单击主页联系人博客和服务页面时,如何在菜单前显示 div?
- typo3 - TYPO3 - 创建新的 sys_category 时“在页面 [uid] 的根行中找不到伪站点”
- python-3.x - 从容器类中删除元素
- c# - 启动和异步即发即弃呼叫的正确方法?
- ios - How to remove all `^M` characters from an iOS project in Mac copied from Windows?
- elasticsearch - ElasticSearch:给定一个文档和一个查询,相关性得分是多少?
- javascript - 如何在javascript中获取GMT的时区偏移量(如GMT+5:30)
- reactjs - 在 React 中使用本地存储隐藏一些元素