Script Preparation code:
x
 
var LIST_OSCILLATION_STATE = { 6: [6, 7] }
var DATE_KEY = 'dateTime'
var data = []
let id = Math.floor(Math.random() * 5)
let nextIdChange = Math.round(Math.random() * 170 + 30)
for (let i = 0; i < 2000; i++) {
    if (i >= nextIdChange) {
      id = Math.floor(Math.random() * 5)
      nextIdChange = Math.round(Math.random() * 170 + 30)
    }
    const wellDepth = Math.random() * 5000
    const dateTime = new Date(Math.round(Date.now() * Math.random())).toISOString()
    data.push({ dateTime, wellDepth, idFeedRegulator: id, state: id + 4 })
}
var makeLimit = (id, dateTime, depth) => ({
    id,
    dateStart: dateTime,
    dateEnd: dateTime,
    depthStart: depth,
    depthEnd: depth,
})
Tests:
  • Before optimization

     
    const getLimitsFromData = (data, accessorName) => {
        if (data.length < 1) return []
        const out = []
        for (let i = 0; i < data.length; i++) {
            if (!data[i][accessorName] || !data[i][DATE_KEY]) continue
            const lastLimit = out?.[out.length - 1]
            let { [accessorName]: id, [DATE_KEY]: dateTime, wellDepth = null } = data[i]
            if (accessorName === 'state')
                for (const [key, states] of Object.entries(LIST_OSCILLATION_STATE))
                    if (states.includes(id))
                        id = Number(key)
            const newDateTime = new Date(dateTime)
            if (lastLimit && lastLimit.id === id) {
                lastLimit.dateEnd = newDateTime
                lastLimit.depthEnd = wellDepth
            } else {
                out.push(makeLimit(id, newDateTime, wellDepth))
            }
        }
        return out
    }
    const saubLimitData = getLimitsFromData(data, 'idFeedRegulator')
    const spinLimitData = getLimitsFromData(data, 'state')
  • After optimization

     
    const getLimitsFromData = (data, accessorName, parseId) => {
        if (data.length < 1) return []
        const out = []
        for (let i = 0; i < data.length; i++) {
            if (!data || !data[i][accessorName] || !data[i][DATE_KEY]) continue
            const lastLimit = out[out.length - 1]
            let { [accessorName]: id, [DATE_KEY]: dateTime, wellDepth = null } = data[i]
            if (typeof parseId === 'function')
                id = parseId(id)
      
            const newDateTime = new Date(dateTime)
            if (lastLimit?.id === id) {
                lastLimit.dateEnd = newDateTime
                lastLimit.depthEnd = wellDepth
                continue
            }
            out.push(makeLimit(id, newDateTime, wellDepth))
        }
        return out
    }
    const saubLimitData = getLimitsFromData(data, 'idFeedRegulator')
    const spinLimitData = getLimitsFromData(data, 'state',
        (id) => Number(Object.keys(LIST_OSCILLATION_STATE).find((key) => LIST_OSCILLATION_STATE[key].includes(id)) ?? id))
Rendered benchmark preparation results:

Suite status: <idle, ready to run>

Previous results

Experimental features:

  • Test case name Result
    Before optimization
    After optimization

    Fastest: N/A

    Slowest: N/A

Latest run results:
Run details: (Test run date: one year ago)
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0
Firefox 121 on Windows
View result in a separate tab
Test name Executions per second
Before optimization 942.9 Ops/sec
After optimization 971.4 Ops/sec