{"ScriptPreparationCode":null,"TestCases":[{"Name":"Test1","Code":"\r\nlet Lru = function(cacheSize,callbackBackingStoreLoad,elementLifeTimeMs=1000){\r\n let maxWait = elementLifeTimeMs;\r\n let size = parseInt(cacheSize,10);\r\n let mapping = {}; // mapping from key to buffer index\r\n let buf = []; // actual buffer that holds cache data\r\n for(let i=0;i\u003Csize;i\u002B\u002B)\r\n {\r\n let rnd = Math.random();\r\n mapping[rnd] = i;\r\n buf.push({data:\u0022\u0022,visited:false, key:rnd});\r\n }\r\n let ctr = 0; // second-chance \u0022hand\u0022 of clock algorithm\r\n let ctrEvict = parseInt(cacheSize/2,10); // eviction \u0022hand\u0022 of clock alg.\r\n let loadData = callbackBackingStoreLoad; // user-given data-storage load fn.\r\n this.get = async function(key){\r\n if(key in mapping)\r\n {\r\n // RAM speed\r\n // check lifetime is over\r\n if(Date.now() - buf[mapping[key]].time \u003E maxWait)\r\n {\r\n delete mapping[key];\r\n return await me.get(key);\r\n }\r\n else\r\n {\r\n // not over, load from RAM\r\n buf[mapping[key]].visited=true;\r\n buf[mapping[key]].time = Date.now();\r\n return buf[mapping[key]].data;\r\n }\r\n }\r\n else\r\n { \r\n // load at data store speed (hdd, network, ...)\r\n\r\n // find a slot to evict for new data\r\n let ctrFound = -1;\r\n while(ctrFound===-1)\r\n {\r\n // give \u0022another chance\u0022 to some \u0022failed\u0022 slots\r\n if(buf[ctr].visited)\r\n {\r\n buf[ctr].visited=false;\r\n }\r\n ctr\u002B\u002B;\r\n if(ctr \u003E= size)\r\n {\r\n ctr=0;\r\n }\r\n\r\n // find a victim\r\n if(!(buf[ctrEvict].visited))\r\n {\r\n // evict\r\n ctrFound = ctrEvict;\r\n }\r\n\r\n ctrEvict\u002B\u002B;\r\n if(ctrEvict \u003E= size)\r\n {\r\n ctrEvict=0;\r\n }\r\n }\r\n delete mapping[buf[ctrFound].key];\r\n mapping[key] = ctrFound;\r\n let dataKey = await loadData(key);\r\n buf[ctrFound] = {data:dataKey, visited:false, key:e.now()};\r\n return buf[ctrFound].data;\r\n }\r\n };\r\n};\r\n\r\nlet lru = new Lru(95/* cache size*/,async function(key){ \r\n /* cache miss, load from data-store */ \r\n for(let i=0;i\u003C10000;i\u002B\u002B){}\r\n return key;\r\n},50 /*miliseconds before next get() invalidates data */);\r\nasync function runThis()\r\n{\r\nfor(let i=0;i\u003C1000;i\u002B\u002B)\r\n{\r\n \r\n \r\nlet myData = await lru.get(parseInt(Math.random()*100,10).toString());\r\nconsole.log(myData);\r\n \r\n}\r\n \r\n}\r\n\r\nrunThis();\r\n \r\n \r\n \r\n \r\n ","IsDeferred":false},{"Name":"Test2","Code":"async function runThis()\r\n{\r\nfor(let i=0;i\u003C1000;i\u002B\u002B)\r\n{\r\n for(let j=0;j\u003C10000;j\u002B\u002B){}\r\n console.log(parseInt(Math.random()*100,10));\r\n}\r\n}\r\n\r\nrunThis();","IsDeferred":false}]}