Skip to content

Instantly share code, notes, and snippets.

@romgrk
Last active March 8, 2024 23:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save romgrk/31c95ea3cec962d1031ce1316450a11d to your computer and use it in GitHub Desktop.
Save romgrk/31c95ea3cec962d1031ce1316450a11d to your computer and use it in GitHub Desktop.
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 }
}
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