- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试提高我对 javascript 中内存的知识。我创建了一个内存功能(我认为..)
我对项目进行了一系列更改(更改日志)。数组中的每个项目都包含一个对其进行编辑的 reference-id(employeeId)。看起来像这样。
const changeLog = [
{
id: 1,
employeeId: 1,
field: 'someField',
oldValue: '0',
newValue: '100',
},
{
id: 2,
employeeId: 2,
field: 'anotherField',
oldValue: '20',
newValue: '100',
},
...
]
const employees = [
{
name: 'Joel Abero',
id: 1
},
{
name: 'John Doe',
id: 2
},
{
name: 'Dear John',
id: 3
}
]
const employees = [
{
name: 'Joel Abero',
id: 1
},
{
name: 'John Doe',
id: 2
},
{
name: 'Dear John',
id: 3
}
]
const changeLog = [
{
id: 1,
employeeId: 1,
field: 'someField',
oldValue: '0',
newValue: '100',
},
{
id: 2,
employeeId: 2,
field: 'anotherField',
oldValue: '0',
newValue: '100',
},
{
id: 3,
employeeId: 3,
field: 'someField',
oldValue: '0',
newValue: '100',
},
{
id: 4,
employeeId: 3,
field: 'someField',
oldValue: '0',
newValue: '100',
},
{
id: 5,
employeeId: 3,
field: 'someField',
oldValue: '0',
newValue: '100',
}
]
function findEditedByEmployee (employeeId) {
return employees.find(({ id }) => id === employeeId)
}
function editedByWithMemoize () {
let employeesSavedInMemory = {}
return function(employeeId) {
if(employeeId in employeesSavedInMemory) {
console.log("from memory")
return employeesSavedInMemory[employeeId]
}
console.log("not from memory")
const findEditedBy = findEditedByEmployee(employeeId)
employeesSavedInMemory[findEditedBy.id] = {name: findEditedBy.name }
return findEditedBy
}
}
const memoizedEmployee = editedByWithMemoize();
// with memoization
const changeLogWithEmployeesMemoized = changeLog.map( log => {
const employeeName = memoizedEmployee(log.employeeId);
return {
...log,
employeeName: employeeName.name
}
})
// without memoization
const changeLogWithEmployees = changeLog.map( log => {
const editedBy = findEditedByEmployee(log.employeeId);
return {
...log,
employeeName: editedBy.name
}
})
console.log('memoized', changeLogWithEmployeesMemoized)
console.log('not memoized', changeLogWithEmployees)
最佳答案
我将尝试回答您的每个问题:
1) How can I perform a test to see which of these two run the fastest?
const fakeAPIRequest = id => new Promise(r => setTimeout(r, 100, {id}))
const cache = {}
const memoizedRequest = async (id) => {
if (id in cache) return Promise.resolve(cache[id])
return cache[id] = await fakeAPIRequest(id)
}
const fakeAPIRequest = id => new Promise(r => setTimeout(r, 100, {id}))
const cache = {}
const memoizedRequest = async (id) => {
if (id in cache) return Promise.resolve(cache[id])
return cache[id] = await fakeAPIRequest(id)
}
const request = async (id) => await fakeAPIRequest(id)
const test = async (name, cb) => {
console.time(name)
for (let i = 50; i--;) {
await cb()
}
console.timeEnd(name)
}
test('memoized', async () => await memoizedRequest('test'))
test('normal', async () => await request('test'))
2) Is this a proper way to use memoization?
3) Is there a rule of thumb when to use memoization? Or should I use it as often as I can?
find
而不是我之前做的 fakeAPI 函数:
const data = [{"id":0},{"id":1},{"id":2},{"id":3},{"id":4},{"id":5},{"id":6},{"id":7},{"id":8},{"id":9},{"id":10},{"id":11},{"id":12},{"id":13},{"id":14},{"id":15},{"id":16},{"id":17},{"id":18},{"id":19},{"id":20},{"id":21},{"id":22},{"id":23},{"id":24},{"id":25},{"id":26},{"id":27},{"id":28},{"id":29},{"id":30},{"id":31},{"id":32},{"id":33},{"id":34},{"id":35},{"id":36},{"id":37},{"id":38},{"id":39},{"id":40},{"id":41},{"id":42},{"id":43},{"id":44},{"id":45},{"id":46},{"id":47},{"id":48},{"id":49},{"id":50},{"id":51},{"id":52},{"id":53},{"id":54},{"id":55},{"id":56},{"id":57},{"id":58},{"id":59},{"id":60},{"id":61},{"id":62},{"id":63},{"id":64},{"id":65},{"id":66},{"id":67},{"id":68},{"id":69},{"id":70},{"id":71},{"id":72},{"id":73},{"id":74},{"id":75},{"id":76},{"id":77},{"id":78},{"id":79},{"id":80},{"id":81},{"id":82},{"id":83},{"id":84},{"id":85},{"id":86},{"id":87},{"id":88},{"id":89},{"id":90},{"id":91},{"id":92},{"id":93},{"id":94},{"id":95},{"id":96},{"id":97},{"id":98},{"id":99}]
const cache = {}
const findObject = id => data.find(o => o.id === id)
const memoizedFindObject = id => id in cache ? cache[id] : cache[id] = findObject(id)
const map = new Map(data.map(o => [o.id, o]))
const findObjectByMap = id => map.get(id)
const list = Array(50000).fill(0).map(() => Math.floor(Math.random() * 100))
const test = (name, cb) => {
console.time(name)
for (let i = 50000; i--;) {
cb(list[i])
}
console.timeEnd(name)
}
test('memoized', memoizedFindObject)
test('normal', findObject)
test('map', findObjectByMap)
关于Javascript memoize 查找数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59963761/
比较术语“memoize”和“cache”并阅读 Wikipedia's memoization entry ,人们是否同意使用术语“memoize”意味着 内存的结果保存在进程的内存中;换句话说,它
在构建自己的内存表失败后,我转向该类并尝试使用它来加速斐波那契数列的双递归定义: fib :: Int -> Int fib 0 = 0 fib 1 = 1 fib n = fib (n-1) + f
我正在尝试提高我对 javascript 中内存的知识。我创建了一个内存功能(我认为..) 我对项目进行了一系列更改(更改日志)。数组中的每个项目都包含一个对其进行编辑的 reference-id(e
我想用元数据注释以非侵入性的方式实现调用缓存(内存)。 希望它会像这样工作: class A{ @Cached foo(msg) { return msg; } } void ma
"Given an array of n integers, return an array of their factorials." 我没有采用遍历数组并为每个元素查找阶乘的直接方法,而是考虑了一
我有一个可用的 memoize 装饰器,它使用 Django 的缓存后端在一定时间内记住函数的结果。我专门将其应用于类方法。 我的装饰器看起来像: def memoize(prefix='mysite
我目前正在学习记忆化。作为一个简单的练习,我用斐波那契数列实现了内存。但是,我遇到的问题是,为什么当我不重命名内存函数时,它的完成速度比重命名时要慢。看一下代码。 这无法正常工作,也无法正确缓存。 f
要内存的函数不是“纯”函数(它的返回值将来可能会改变)所以我不能使用 memoize装饰。此外,我将需要调用它的值列表。 我做的是 def f(...): cache = {} for
我有一个具有以下签名的函数: def spectrogram(signal: numpy.ndarray, sampling_frequency=16000, win_len=512, hop=256
我似乎无法弄清楚如何在 Grails 中进行内存。根据 GPars 文档,它应该很简单def c = { x -> x*2 }.memoize() or ... .gmemoize() 但我似乎得到的
我正在使用 here 中的 memoize 配方并对返回 2 个值的函数进行了稍微修改。我使用此包装器创建两个单独的函数,分别返回第一个和第二个值,但函数计算会被缓存,以便使用相同参数调用任一返回函数
我正在尝试在 javascript 中内存一个函数,以便在客户端的浏览器中运行。用 R(我最习惯使用的语言)编写此函数。在 R 中,我看到使用记忆化的显着好处(P_n(7/10, 20, 15, 6,
假设是 ES5,我想做这样的事情。 var memoizedFunc = (function(params) { var cache = {}; var mem = function(para
我正在尝试使用 memoize 函数比较两个不同的 Symbol()。到目前为止 id1 === id2 - true 应该是 false。我看到问题出在哪里,但不确定如何解决。如果您有任何想法或如何
我在使用此功能时遇到多个问题。这是数据结构和算法类(class)的附加问题的一部分,我在这个问题上投入了很多时间,我真的很想让它工作并了解发生了什么。 有一个主要问题,引起了几个小问题……这个问题的名
answerKey[parameters] 是如何工作的?如果 Array.prototype.slice.call(arguments)返回一个数组[157, 687],answerKey[para
我今天意识到 _memoize 函数只缓存提供的第一个参数的结果。 function add(a, b) { return a + b; } var sum = _.memoize(add); c
var fibo = function (x) { console.log(x); if (x === 1) return 1; if (x === 2) return 2; retu
我正在尝试在 Rust 中内存一个递归的 collatz 序列函数,但是我需要内存值的散列图来在不同的函数调用中保存它的内容。有没有一种优雅的方法可以在 rust 中执行此操作,还是我必须在 ma
引用:Smart self overwriting lazy getters 有谁知道依赖浏览器内存来获取这些 getter 是否有任何警告? 我的意思是:不同的浏览器是否选择不存储这些值? 最佳答案
我是一名优秀的程序员,十分优秀!