哪种代码更快(“如果为空||未定义”与“调用断言”)?

时间:2018-07-18 20:20:08

标签: javascript performance

为了使我的代码更易读和更清晰,我想在使用专用断言函数进行所有值检查时切换到方法。基本上,将使用“错误”参数代替函数“ if”。

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

这里有两个代码片段作为示例:

1。

assertIsSet = (value, error) => { if (value === null || value === undefined) throw new Error(error); }

...

assertIsSet(options, 'options argument is required.');

...

2。

if (options === null || options === undefined) throw new Error('options argument is required.')

我对现代JS引擎以及它们如何编译/优化代码一无所知,而且我认为在99%的情况下差异不会很明显,但是我正在创建基于画布的复杂应用程序每5毫秒。

您认为家伙,我的担心合理吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

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

我已经设置了两个jsbench.me版本来对此进行测试:

  1. https://jsbench.me/anjjrl78hi/1
  2. https://jsbench.me/anjjrl78hi/2

多次运行第一个版本并没有明显差异。

在“全局”定义函数(版本2)时,它偏向if版本。从我的角度来看,JS需要检查各种范围,在哪里可以找到定义的函数。但是,它的性能并没有比if差。

因此,如果您不经常使用assertIsSet,则可以通过内联获得最佳效果。无需手动进行操作,您可以将代码“编译”为可以内联assertIsSet调用的内容(可能是Webpack插件或类似的内容可能会有所帮助)。或者,如果您需要对性能有严格要求的话,请看一下WebAssembly。

答案 1 :(得分:0)

做一些性能测试,这两种方法跑了1000000次,结果是

function perf_test_take() {
    let options = {};
    console.time('assertion');
    for (let i = 0; i < 1000000; i++) assertIsSet(options, 'pretty long string pretty long string pretty long string pretty long string');
    console.timeEnd('assertion');
    console.time('if statement');
    for (let i = 0; i < 1000000; i++) {
        if (options === null || options === undefined) {
            throw new Error('pretty long string pretty long string pretty long string pretty long string');
        }
    }
    console.timeEnd('if statement');
}

function perf_test_take_kickoff() {
    console.log('take 1');
    perf_test_take();
    console.log('take 2');
    perf_test_take();
    console.log('take 3');
    perf_test_take();
    console.log('take 4');
    perf_test_take();
    console.log('take 5');
    perf_test_take();
    console.log('take 6');
    perf_test_take();
}

// OUTPUT

// take 1
assertion: 3.5927734375ms
if statement: 2.337890625ms

// take 2
assertion: 0.524169921875ms
if statement: 0.7998046875ms

// take 3
assertion: 0.54296875ms
if statement: 0.535888671875ms

// take 4
assertion: 0.5322265625ms
if statement: 0.47998046875ms

// take 5
assertion: 0.51611328125ms
if statement: 0.5009765625ms

// take 6
assertion: 0.546875ms
if statement: 0.503173828125ms

我认为不是这样!