将C函数转换为Javascript
最终编辑:我错了。Redis文档中没有任何内容表明计数器仅达到255,约为100万。只是当点击量达到100万次时,计数器已达到255。案件结案。别再看了将C函数转换为Javascript,javascript,c,algorithm,Javascript,C,Algorithm,最终编辑:我错了。Redis文档中没有任何内容表明计数器仅达到255,约为100万。只是当点击量达到100万次时,计数器已达到255。案件结案。别再看了 我正在尝试从C移植到JS。它使用莫里斯计数器 常数: LFU_INIT_VAL=5。看到了 lfu\u log\u系数=10。看见 找到了C函数 根据上表,如果lfu\u log\u因子为10,当达到100万次点击时,计数器应为255。然而,当运行我的JS代码时,计数器在~300k的点击次数中始终达到255次。我做错了什么 下面是一次JS代码
我正在尝试从C移植到JS。它使用莫里斯计数器 常数:
LFU_INIT_VAL=5
。看到了
lfu\u log\u系数=10
。看见
找到了C函数
根据上表,如果lfu\u log\u因子
为10,当达到100万次点击时,计数器应为255。然而,当运行我的JS代码时,计数器在~300k的点击次数中始终达到255次。我做错了什么
下面是一次JS代码运行的结果,将实际命中率与预期命中率进行比较,系数为10:
(预计为100,超过49)新计数器:10,i=149
(预计约1000,低于348)新计数器:18,i=652
(预计为100k,低于3617)新计数器:142,i=96383
(预计为1M,低于724639!!!)新计数器:255,i=275361
要么表格错误/过时,要么我执行的测试错误,要么代码正确,我误解了结果。根据我的谷歌搜索,应该是这样的。在这个链接中:,它说“一个0到1之间的随机数R被提取出来。”。如果你想读的话,它会更详细。随机观察:在C代码中,
r
在[0,1]中,而在JS中,r
在[0,1]中。你确定LFU_INIT_VAL
对两者都是一样的吗?是的,应该是5。
/* Logarithmically increment a counter. The greater is the current counter value
* the less likely is that it gets really implemented. Saturate it at 255. */
uint8_t LFULogIncr(uint8_t counter) {
if (counter == 255) return 255;
double r = (double)rand()/RAND_MAX;
double baseval = counter - LFU_INIT_VAL;
if (baseval < 0) baseval = 0;
double p = 1.0/(baseval*server.lfu_log_factor+1);
if (r < p) counter++;
return counter;
}
LFU_INIT_VAL = 5
lfu_log_factor = 10
function LFULogIncr(counter) {
if (counter == 255) return 255;
let r = Math.random();
let baseval = counter - LFU_INIT_VAL;
if (baseval < 0) baseval = 0;
let p = 1.0/(baseval*lfu_log_factor+1);
if (r < p) counter++;
return counter;
}
let hitFreq = 5
for (let i = 0; i < 1000000; i++) {
let newHitFreq = LFULogIncr(hitFreq)
if (newHitFreq > hitFreq) {
console.log(`New counter: ${newHitFreq}, i = ${i}`)
}
hitFreq = newHitFreq
}
+--------+------------+------------+------------+------------+------------+
| factor | 100 hits | 1000 hits | 100K hits | 1M hits | 10M hits |
+--------+------------+------------+------------+------------+------------+
| 0 | 104 | 255 | 255 | 255 | 255 |
+--------+------------+------------+------------+------------+------------+
| 1 | 18 | 49 | 255 | 255 | 255 |
+--------+------------+------------+------------+------------+------------+
| 10 | 10 | 18 | 142 | 255 | 255 |
+--------+------------+------------+------------+------------+------------+
| 100 | 8 | 11 | 49 | 143 | 255 |
+--------+------------+------------+------------+------------+------------+