我正在尝试撰写一篇关于我在javascript中开发和编码的算法的科学文章。我希望将旧的慢速版本与各种输入的新版本进行比较,并能够报告一些指标,例如对Math.log的调用次数,对Math.exp的调用次数,乘法运算次数,除法运算次数,加法次数,减法次数等
我意识到javascript引擎的JIT编译器可以进行一些优化,可以稍微改变这些数字,但我并不真正关心每个指标的确切细节,只是我正在比较苹果和苹果跨两种算法。
是否有任何工具或方法可以在javascript中自动计算这些操作?是否有任何javascript引擎生成某种类型的中间字节码,允许自动计算这些操作?如果不是javascript,那么在c ++中呢?
答案 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函数的回答相结合,我能够完成我的目标。