使用$ timeout vs lodash_.debounce基准测试进行Angular本机去抖动

时间:2016-04-25 13:57:42

标签: javascript angularjs lodash

想要测试哪种方法更快,使用原始角度$timeout或者_.debounce()函数内置的lodash的去抖函数。

所以我创建了基准测试,想要问一下,这个基准测试是否可以被认为是客观的,如果没有,那么应该改变什么以便测试两个函数的测试相同?

https://jsfiddle.net/ues8d4pL/

用$ timeout测试,行 使用debounceUpdate({ value: i }, $scope.model);

测试lodash功能

// 2. Test With lodash
// _.debounce(function() {
//     saveParameters({ value: i }, $scope.model);
// }, 1000)();

行应取消注释。对我来说,$ timeout需要2585.61msecs,lodash需要4240.875msecs。

这个基准可以被认为是正确的,如果不是我需要改变的吗?

使用原生$ timeout或lodash debounce,哪种方式更可取?

1 个答案:

答案 0 :(得分:2)

基准测试的执行方式错误。

setTimeout

在每次迭代时创建一个新的去抖函数并立即调用它,它类似于在每次迭代时执行$rootScope.$apply()并且没有任何去抖动效果。无节制功能在CPU上相对较轻的原因是因为它没有$timeout(如_.debounce)。

可以直接与$timeout去抖动进行比较的var lodashDebounceUpdate = _.debounce(function() { $timeout(function () { saveParameters({ value: i }, $scope.model); }); }, 1000); for (...) { lodashDebounceUpdate(); } 的正确使用是

$timeout

没有什么真正的本土'在_.debounce中,它只是wraps setTimeout under the hood在规范中可以同步执行的方式。

在早期的Underscore / Lodash实施中,setTimeout以类似的直观方式使用Date.now()

在现代版本中,UnderscoreLodash都已切换到使用_.debounce的实现,并且速度提高约50000倍(测量基于私人体外基准测试)。

所以是的,$timeout比基于自定义setTimeout / Exception in thread "main" java.lang.NullPointerException at java.lang.ProcessBuilder.start(ProcessBuilder.java:1010) at org.apache.hadoop.util.Shell.runCommand(Shell.java:482) at org.apache.hadoop.util.Shell.run(Shell.java:455) at org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:715) at org.apache.hadoop.util.Shell.execCommand(Shell.java:808) at org.apache.hadoop.util.Shell.execCommand(Shell.java:791) at org.apache.hadoop.fs.RawLocalFileSystem.setPermission(RawLocalFileSystem.java:659) at org.apache.hadoop.fs.RawLocalFileSystem.mkdirs(RawLocalFileSystem.java:447) at org.apache.hadoop.fs.FilterFileSystem.mkdirs(FilterFileSystem.java:293) at org.apache.hadoop.mapreduce.JobSubmissionFiles.getStagingDir(JobSubmissionFiles.java:133) at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:145) at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1297) at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1294) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:415) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1656) at org.apache.hadoop.mapreduce.Job.submit(Job.java:1294) at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:1315) at pl.flomedia.hadoop.Main.run(Main.java:52) at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70) at pl.flomedia.hadoop.Main.main(Main.java:28) 的去抖动功能更具性能,如果去抖功能每秒需要数百次调用,这将是有益的。否则,这可能被视为过早优化。