Last active
March 8, 2024 23:36
-
-
Save romgrk/31c95ea3cec962d1031ce1316450a11d to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
V8 | |
{ | |
'react:equal:monomorphic': { average: 1206.33, stddev: 59.63406930792349 }, | |
'react:unequal:monomorphic': { average: 1198.67, stddev: 41.51572660517404 }, | |
'hughsk/shallow-equals:equal:monomorphic': { average: 595.33, stddev: 33.47967874530592 }, | |
'hughsk/shallow-equals:unequal:monomorphic': { average: 559.33, stddev: 1.699673171197595 }, | |
'romgrk-fastCompareUnsafe:equal:monomorphic': { average: 510.33, stddev: 1.247219128924647 }, | |
'romgrk-fastCompareUnsafe:unequal:monomorphic': { average: 447.67, stddev: 2.0548046676563256 }, | |
'romgrk-fastCompareStrict:equal:monomorphic': { average: 881.33, stddev: 1.699673171197595 }, | |
'romgrk-fastCompareStrict:unequal:monomorphic': { average: 775.33, stddev: 0.9428090415820634 }, | |
'romgrk-fastCompare:equal:monomorphic': { average: 892.33, stddev: 4.714045207910316 }, | |
'romgrk-fastCompare:unequal:monomorphic': { average: 787.67, stddev: 4.642796092394706 } | |
} | |
JSC | |
{ | |
"react:equal:monomorphic": { average: 401, stddev: 25.152865973217974, }, | |
"react:unequal:monomorphic": { average: 415.33, stddev: 3.39934634239519, }, | |
"hughsk/shallow-equals:equal:monomorphic": { average: 297, stddev: 14.236104336041748, }, | |
"hughsk/shallow-equals:unequal:monomorphic": { average: 189.33, stddev: 2.0548046676563256, }, | |
"romgrk-fastCompareUnsafe:equal:monomorphic": { average: 313.67, stddev: 30.26916289265731, }, | |
"romgrk-fastCompareUnsafe:unequal:monomorphic": { average: 244.67, stddev: 3.8586123009300755, }, | |
"romgrk-fastCompareStrict:equal:monomorphic": { average: 199.67, stddev: 6.847546194724712, }, | |
"romgrk-fastCompareStrict:unequal:monomorphic": { average: 128.67, stddev: 1.247219128924647, }, | |
"romgrk-fastCompare:equal:monomorphic": { average: 293, stddev: 27.067816067549053, }, | |
"romgrk-fastCompare:unequal:monomorphic": { average: 236, stddev: 1.4142135623730951, }, | |
} | |
SpiderMonkey | |
{ | |
"react:equal:monomorphic": { "average": 975.33, "stddev": 1.247219128924647 }, | |
"react:unequal:monomorphic": { "average": 1073, "stddev": 13.490737563232042 }, | |
"hughsk/shallow-equals:equal:monomorphic": { "average": 661.33, "stddev": 50.54590872552287 }, | |
"hughsk/shallow-equals:unequal:monomorphic": { "average": 509, "stddev": 22.015146301277824 }, | |
"romgrk-fastCompareUnsafe:equal:monomorphic": { "average": 468.33, "stddev": 6.182412330330469 }, | |
"romgrk-fastCompareUnsafe:unequal:monomorphic": { "average": 466.67, "stddev": 3.091206165165235 }, | |
"romgrk-fastCompareStrict:equal:monomorphic": { "average": 506.33, "stddev": 3.39934634239519 }, | |
"romgrk-fastCompareStrict:unequal:monomorphic": { "average": 503.67, "stddev": 3.6817870057290873 }, | |
"romgrk-fastCompare:equal:monomorphic": { "average": 495.67, "stddev": 13.474255287605157 }, | |
"romgrk-fastCompare:unequal:monomorphic": { "average": 481, "stddev": 2.160246899469287 } | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import { memo } from 'react' | |
const is = Object.is; | |
export default fastMemo; | |
export function fastMemo<T>(component: T): T { | |
return memo(component as any, fastCompare) as unknown as T; | |
} | |
export function fastMemoUnsafe<T>(component: T): T { | |
return memo(component as any, fastCompareUnsafe) as unknown as T; | |
} | |
export function fastMemoStrict<T>(component: T): T { | |
return memo(component as any, fastCompareStrict) as unknown as T; | |
} | |
export function fastCompareStrict<T extends Record<string, any> | null>(a: T, b: T) { | |
if (a === b) { | |
return true; | |
} | |
if (!(a instanceof Object) || !(b instanceof Object)) { | |
return false; | |
} | |
let aLength = 0; | |
let bLength = 0; | |
for (const key in a) { | |
aLength += 1; | |
if (!is(a[key], b[key])) { | |
return false; | |
} | |
if (!(key in b)) { | |
return false; | |
} | |
} | |
for (const _ in b) { | |
bLength += 1; | |
} | |
return aLength === bLength; | |
} | |
export function fastCompare<T extends Record<string, any>>(a: T, b: T) { | |
let aLength = 0; | |
let bLength = 0; | |
for (const key in a) { | |
aLength += 1; | |
if (!is(a[key], b[key])) { | |
return false; | |
} | |
if (!(key in b)) { | |
return false; | |
} | |
} | |
for (const _ in b) { | |
bLength += 1; | |
} | |
return aLength === bLength; | |
} | |
export function fastCompareUnsafe<T extends Record<string, any>>(a: T, b: T) { | |
let aLength = 0; | |
let bLength = 0; | |
for (const key in a) { | |
aLength += 1; | |
if (!is(a[key], b[key])) { | |
return false; | |
} | |
} | |
for (const _ in b) { | |
bLength += 1; | |
} | |
return aLength === bLength; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment