javascript中浮点操作的计数

javascript中浮点操作的计数,javascript,profiling,time-complexity,Javascript,Profiling,Time Complexity,我试图写一篇关于我用javascript开发和编码的算法的科学文章。我希望对各种输入将旧的、慢的版本与新的、快的版本进行比较,并能够报告一些指标,如调用Math.log的次数、调用Math.exp的次数、乘法运算的次数、除法运算的次数、加法的次数、减法的次数等 我意识到javascript引擎的JIT编译器可以进行一些优化,从而稍微改变这些数字,但我并不真正关心每个指标的确切细节,我只是比较两种算法的优劣 是否有任何工具或方法可以在javascript中自动计算这些操作?是否有javascrip

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

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


是否有任何工具或方法可以在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) {...}
所以像var
var 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函数中使用它。不过,我更担心的是基本的*/+-操作。有什么想法吗?