update
This commit is contained in:
42
main/lru-cache.js
Normal file
42
main/lru-cache.js
Normal file
@@ -0,0 +1,42 @@
|
||||
// P2-6(audit):通用 LRU 缓存 —— Map 迭代序即插入序,get/set 命中时
|
||||
// delete+set 把键提到最新;set 超 maxSize 删最老(第一个键)。
|
||||
//
|
||||
// 用途:main/ai.js 的 pickOpenAITokenConfig / joinUrl 每次调用重复跑
|
||||
// 正则 + new URL 解析;同 model / 同 baseURL 在一次会话里反复命中,
|
||||
// 缓存结果省 CPU。maxSize 64 足够覆盖「用户试过的模型 + URL」组合,
|
||||
// 不会无界增长。
|
||||
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
* @param {object} [opts]
|
||||
* @param {number} [opts.maxSize=64]
|
||||
* @returns {{ get: (k: any) => any, set: (k: any, v: any) => void,
|
||||
* has: (k: any) => boolean, size: number }}
|
||||
*/
|
||||
function createLruCache({ maxSize = 64 } = {}) {
|
||||
const map = new Map();
|
||||
return {
|
||||
get(key) {
|
||||
if (!map.has(key)) return undefined;
|
||||
const v = map.get(key);
|
||||
// LRU:提到最新
|
||||
map.delete(key);
|
||||
map.set(key, v);
|
||||
return v;
|
||||
},
|
||||
set(key, value) {
|
||||
// 覆盖同键 = 使用一次,提到最新
|
||||
if (map.has(key)) map.delete(key);
|
||||
map.set(key, value);
|
||||
if (map.size > maxSize) {
|
||||
// Map 第一个键 = 最老
|
||||
map.delete(map.keys().next().value);
|
||||
}
|
||||
},
|
||||
has(key) { return map.has(key); },
|
||||
get size() { return map.size; },
|
||||
};
|
||||
}
|
||||
|
||||
module.exports = { createLruCache };
|
||||
Reference in New Issue
Block a user