Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 什么代码更快(“if null”、“undefined”vs“call assertion”)?_Javascript_Performance - Fatal编程技术网

Javascript 什么代码更快(“if null”、“undefined”vs“call assertion”)?

Javascript 什么代码更快(“if null”、“undefined”vs“call assertion”)?,javascript,performance,Javascript,Performance,为了使我的代码更具可读性和更清晰,我想在使用专用断言函数进行所有值检查时切换到这种方法。基本上不用“if”语句,而是用“error”参数调用函数 我担心这种方法是否会使我的代码运行变慢:a)函数调用更重。b) 字符串值始终被分配,而不是在if块中分配 以下是两段代码作为示例: 一, assertesset=(值,错误)=>{if(值===null | |值===undefined)抛出新错误(错误);} ... 断言集(选项,'需要选项参数'); ... 二, if(options==null

为了使我的代码更具可读性和更清晰,我想在使用专用断言函数进行所有值检查时切换到这种方法。基本上不用“if”语句,而是用“error”参数调用函数

我担心这种方法是否会使我的代码运行变慢:a)函数调用更重。b) 字符串值始终被分配,而不是在if块中分配

以下是两段代码作为示例:

一,

assertesset=(值,错误)=>{if(值===null | |值===undefined)抛出新错误(错误);}
...
断言集(选项,'需要选项参数');
...
二,

if(options==null | | options==undefined)抛出新错误('options参数是必需的')
我对现代JS引擎以及它们如何编译/优化代码的了解还不够,我不认为在99%的情况下会出现明显的差异,但我正在创建一个复杂的基于画布的应用程序,每5毫秒我就要努力一次

你们觉得我的担心合理吗


谢谢

做了一些性能测试,运行了这两种方法的1000000次,结果如下

function perf_test_take(){
让选项={};
console.time(“断言”);
对于(设i=0;i<1000000;i++)断言集(选项“相当长的字符串相当长的字符串相当长的字符串相当长的字符串”);
console.timeEnd('assertion');
console.time(“if语句”);
对于(设i=0;i<1000000;i++){
如果(选项===null | |选项===未定义){
抛出新错误('pretty long string pretty long string pretty long string');
}
}
console.timeEnd('if语句');
}
功能性能测试、接收、启动(){
console.log('take 1');
性能测试采取();
console.log('take 2');
性能测试采取();
console.log('take 3');
性能测试采取();
console.log('take 4');
性能测试采取();
console.log('take 5');
性能测试采取();
console.log('take 6');
性能测试采取();
}
//输出
//拿1
断言:3.5927734375ms
if语句:2.337890625ms
//拿2块
断言:0.524169921875ms
if语句:0.7998046875ms
//第三次
断言:0.54296875ms
if语句:0.535888671875ms
//拿4块
断言:0.5322265625ms
if语句:0.47998046875ms
//拿5块
断言:0.51611328125ms
if语句:0.5009765625ms
//拿6块
断言:0.546875ms
if语句:0.503173828125ms

我想不是这样的

如果要检查代码的性能,JSBench.me通常很有用

我已经设置了两个jsbench.me版本来测试这一点:

  • 运行第一个版本几次并没有产生显著的差异

    当“全局”定义函数(版本2)时,它更偏向于
    if
    版本。在我看来,JS需要检查不同的作用域,在那里可以找到定义的函数。但是,它的性能并不比
    if


    因此,如果您没有太频繁地使用
    assertiset
    ,可以通过内联它来获得最佳结果。你可以将你的代码“编译”成内联你的
    assertiset
    调用的东西,而不是手工操作(可能是一个网页插件或类似的东西可能会有所帮助)。如果您需要性能关键的东西,也可以查看WebAssembly。

    根据功能的设置方式,您可以使用此
    arguments.length==0&&throw new Error(“…”)
    或类似的东西函数的优点是您可以修复它,而不必更改代码中的任何其他内容。具体地说,调试完成后,您可以使其成为“null函数”,而无需删除所有调用。(也就是说,
    assertiset=(value,error)=>{return}
    将使它在没有实际断言的情况下运行,尽管在JS中仍然可以计算断言的表达式。)@AlexisWilke,null函数是一个很好的技巧!谢谢感谢您的回复!关于编译代码-是的,我想我会花时间去学习它,我听说谷歌闭包编译器也提高了一些性能,这是真的吗?WebAssembly是现在的梦想,代码库对于从JS到C/C++的1对1移植来说太复杂了。我用原型链式,C++有类,我用对象文字,C++有类,需要写画布API桥和很多东西…不幸的是,现在这几乎是不可能的,但我有时会读到wasm新闻。通常,你从一种类型化语言编译到asm.js,它是JavaScript的一个子集,可以通过各种JavaScript引擎进行优化。对于“compile”,我的意思是您可以向JS中添加一个构建步骤,并让一些脚本内联
    断言集
    调用,意思是“如果,则替换为
    ”。但在任何情况下,如果您需要在浏览器中运行高性能代码,请务必查看WebAssembly。