feat: speed up compile by map by wwwzbwcom · Pull Request #713 · gpujs/gpu.js

Checking the first element by indexOf is also slower:

const mathFunctionsMap = {
  abs: true,
  acos: true,
  acosh: true,
  asin: true,
  asinh: true,
  atan: true,
  atan2: true,
  atanh: true,
  cbrt: true,
  ceil: true,
  clz32: true,
  cos: true,
  cosh: true,
  expm1: true,
  exp: true,
  floor: true,
  fround: true,
  imul: true,
  log: true,
  log2: true,
  log10: true,
  log1p: true,
  max: true,
  min: true,
  pow: true,
  random: true,
  round: true,
  sign: true,
  sin: true,
  sinh: true,
  sqrt: true,
  tan: true,
  tanh: true,
  trunc: true,
};


function isAstMathFunctionMap(ast) {
  return !!mathFunctionsMap[ast];
}


const mathFunctions = [
    "abs",
    "acos",
    "acosh",
    "asin",
    "asinh",
    "atan",
    "atan2",
    "atanh",
    "cbrt",
    "ceil",
    "clz32",
    "cos",
    "cosh",
    "expm1",
    "exp",
    "floor",
    "fround",
    "imul",
    "log",
    "log2",
    "log10",
    "log1p",
    "max",
    "min",
    "pow",
    "random",
    "round",
    "sign",
    "sin",
    "sinh",
    "sqrt",
    "tan",
    "tanh",
    "trunc",
  ];

function isAstMathFunctionList(ast) {
  return mathFunctions.indexOf(ast) > -1;
}

console.time("isAstMathFunctionMap");
// console.log(isAstMathFunctionSet(""));
// console.log(isAstMathFunctionSet("trunc"));
for (let i = 0; i < 1e8; i++) {
    isAstMathFunctionMap("abs")
}
console.timeEnd("isAstMathFunctionMap");


console.time("isAstMathFunctionList");
for (let i = 0; i < 1e8; i++) {
  isAstMathFunctionList("abs");
}
console.timeEnd("isAstMathFunctionList");

/*
const mathFunctionsMap = {
  abs: true,
  acos: true,
  acosh: true,
  asin: true,
  asinh: true,
  atan: true,
  atan2: true,
  atanh: true,
  cbrt: true,
  ceil: true,
  clz32: true,
  cos: true,
  cosh: true,
  expm1: true,
  exp: true,
  floor: true,
  fround: true,
  imul: true,
  log: true,
  log2: true,
  log10: true,
  log1p: true,
  max: true,
  min: true,
  pow: true,
  random: true,
  round: true,
  sign: true,
  sin: true,
  sinh: true,
  sqrt: true,
  tan: true,
  tanh: true,
  trunc: true,
};


function isAstMathFunctionMap(ast) {
  return !!mathFunctionsMap[ast];
}


const mathFunctions = [
    "abs",
    "acos",
    "acosh",
    "asin",
    "asinh",
    "atan",
    "atan2",
    "atanh",
    "cbrt",
    "ceil",
    "clz32",
    "cos",
    "cosh",
    "expm1",
    "exp",
    "floor",
    "fround",
    "imul",
    "log",
    "log2",
    "log10",
    "log1p",
    "max",
    "min",
    "pow",
    "random",
    "round",
    "sign",
    "sin",
    "sinh",
    "sqrt",
    "tan",
    "tanh",
    "trunc",
  ];

function isAstMathFunctionList(ast) {
  return mathFunctions.indexOf(ast) > -1;
}

console.time("isAstMathFunctionMap");
// console.log(isAstMathFunctionSet(""));
// console.log(isAstMathFunctionSet("trunc"));
for (let i = 0; i < 1e8; i++) {
    isAstMathFunctionMap("abs")
}
console.timeEnd("isAstMathFunctionMap");


console.time("isAstMathFunctionList");
for (let i = 0; i < 1e8; i++) {
  isAstMathFunctionList("abs");
}
console.timeEnd("isAstMathFunctionList");

/*
isAstMathFunctionMap: 74.071ms
isAstMathFunctionList: 375.602ms
*/