在javascript

时间:2017-09-15 21:51:32

标签: javascript profiling time-complexity

我正在尝试撰写一篇关于我在javascript中开发和编码的算法的科学文章。我希望将旧的慢速版本与各种输入的新版本进行比较,并能够报告一些指标,例如对Math.log的调用次数,对Math.exp的调用次数,乘法运算次数,除法运算次数,加法次数,减法次数等

我意识到javascript引擎的JIT编译器可以进行一些优化,可以稍微改变这些数字,但我并不真正关心每个指标的确切细节,只是我正在比较苹果和苹果跨两种算法。

是否有任何工具或方法可以在javascript中自动计算这些操作?是否有任何javascript引擎生成某种类型的中间字节码,允许自动计算这些操作?如果不是javascript,那么在c ++中呢?

2 个答案:

答案 0 :(得分:1)

这是一个包装原始Math.sin&的非常简单的例子。 Math.log,并保持计数。

这是有效的,因为在Javascript中你甚至有能力取代内置的......



let counts = {};

function profileProc(root, name, proc) {
  let oProc = proc;
  root[name] = function() {
    counts[name] = counts[name] ? counts[name] + 1 : 1;
    return oProc.apply(proc, arguments);
  }
}

profileProc(Math, 'log', Math.log);
profileProc(Math, 'sin', Math.sin);

console.log(Math.log(10));
console.log(Math.sin(10));
console.log(Math.sin(20));

console.log(counts);




答案 1 :(得分:0)

好吧,看起来我找到了有用的东西。作为paper.js的一部分,有一种名为PaperScript的脚本语言,它解析用javascript语法编写的代码,并按照here的说明添加运算符重载。基本上paper.js提供了paper.PaperScript.compile(code)函数接受javascript代码并用调用替换每个数学运算

function __$__(left, operator, right) {...}

因此var var c = a * b;之类的表达式变为var c = __$__(a, '*', b);一旦进行了这种转换,修改__$__函数以计算操作很简单:

window.operatorCounts = {};
window.operatorCounts['+'] = 0;
window.operatorCounts['-'] = 0;
window.operatorCounts['*'] = 0;
window.operatorCounts['/'] = 0;
window.operatorCounts['%'] = 0;
window.operatorCounts['=='] = 0;
window.operatorCounts['!='] = 0;

function __$__(left, operator, right) {
  window.operatorCounts[operator]++;
  switch (operator) {
  case '+': return left + right;
  case '-': return left - right;
  case '*': return left * right;
  case '/': return left / right;
  case '%': return left % right;
  case '==': return left == right;
  case '!=': return left != right;
  default:
    throw new Error('Implement Operator: ' + operator);
  }
};

在定义了这个检测版本的运算符后,运行新的编译函数是一件简单的事情。通过将此与Keith对Math.x函数的回答相结合,我能够完成我的目标。