想要测试哪种方法更快,使用原始角度$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,哪种方式更可取?
答案 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()
。
在现代版本中,Underscore和Lodash都已切换到使用_.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)
的去抖动功能更具性能,如果去抖功能每秒需要数百次调用,这将是有益的。否则,这可能被视为过早优化。