javascript中浮点操作的计数
我试图写一篇关于我用javascript开发和编码的算法的科学文章。我希望对各种输入将旧的、慢的版本与新的、快的版本进行比较,并能够报告一些指标,如调用Math.log的次数、调用Math.exp的次数、乘法运算的次数、除法运算的次数、加法的次数、减法的次数等 我意识到javascript引擎的JIT编译器可以进行一些优化,从而稍微改变这些数字,但我并不真正关心每个指标的确切细节,我只是比较两种算法的优劣javascript中浮点操作的计数,javascript,profiling,time-complexity,Javascript,Profiling,Time Complexity,我试图写一篇关于我用javascript开发和编码的算法的科学文章。我希望对各种输入将旧的、慢的版本与新的、快的版本进行比较,并能够报告一些指标,如调用Math.log的次数、调用Math.exp的次数、乘法运算的次数、除法运算的次数、加法的次数、减法的次数等 我意识到javascript引擎的JIT编译器可以进行一些优化,从而稍微改变这些数字,但我并不真正关心每个指标的确切细节,我只是比较两种算法的优劣 是否有任何工具或方法可以在javascript中自动计算这些操作?是否有javascrip
是否有任何工具或方法可以在javascript中自动计算这些操作?是否有javascript引擎生成某种类型的中间字节码,从而允许自动计算这些操作?如果不是JavaScript,那么C++中的什么?< P>这是一个非常简单的例子,它包括了原始的Mth.Sn.Math.Load,并保持了调用的计数。p> 这是因为在Javascript中,您甚至可以替换内置的
let counts={};
函数profileProc(根、名称、过程){
设oProc=proc;
根[名称]=函数(){
计数[名称]=计数[名称]?计数[名称]+1:1;
返回oProc.apply(过程、参数);
}
}
profileProc(Math,'log',Math.log);
profileProc(数学'sin',数学.sin);
console.log(数学日志(10));
console.log(Math.sin(10));
console.log(Math.sin(20));
控制台日志(计数)代码>嗯,看来我找到了一些有效的方法。作为paper.js的一部分,有一种名为的脚本语言,它解析用javascript语法编写的代码,并添加操作符重载,如前所述。基本上,paper.js提供了paper.PaperScript.compile(code)
函数接受javascript代码,并用调用
function __$__(left, operator, right) {...}
所以像varvar c=a*b这样的表达式代码>变为var c=_$__;(a,'*',b)代码>完成此转换后,修改\uu$\ u
函数以计数操作非常简单:
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函数的回答,我能够完成我开始做的事情。Chrome可能会在其配置文件结果中显示调用Math.x
的次数。Javascript允许您重新定义内置方法,。例如->var-oLog=Math.log;Math.log=(x)=>{console.log('log');返回oLog(x);}
将控制台输出log
并返回原始日志。因此,如果您没有太多要评测的函数,这个简单的方法就可以了。谢谢,我肯定会在Math.x函数中使用它。不过,我更担心的是基本的*/+-操作。有什么想法吗?