为了使我的代码更易读和更清晰,我想在使用专用断言函数进行所有值检查时切换到方法。基本上,将使用“错误”参数代替函数“ 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毫秒。
您认为家伙,我的担心合理吗?
谢谢!
答案 0 :(得分:1)
如果您要检查代码的性能,JSBench.me通常很有用。
我已经设置了两个jsbench.me版本来对此进行测试:
多次运行第一个版本并没有明显差异。
在“全局”定义函数(版本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
我认为不是这样!