IndexOf vs _.indexOf(Underscore.js) vs $.Array ,在使用数组时哪个性能更好?
IndexOf vs _.indexOf(Underscore.js) vs $.inArray ,which has better perfromance while working with array?
注意:根据复选框选择触发事件并且有多个复选框,我需要在选中另一个复选框之前完成执行,因此速度是importance.Please帮助并提前感谢
jQuery 的 $.inArray is effectively just a wrapper for vanilla Array.indexOf, when it exists (which it does in all 现代浏览器。)
Underscore 的 _.indexOf 更复杂,包括对某些情况的一些特殊处理——例如,如果数组已经排序,它将使用二进制搜索——因此在某些情况下可能更快。
找出最快的方法是 运行 针对您的真实数据进行性能测试;不同的算法可能更快或更慢,具体取决于它们使用的数据类型。
(同样值得考虑的是,仅仅为了它包含的一个可能更快的函数而包含整个外部库是否合理;除非您已经依赖于该库的其他函数,否则最好看看它是什么库代码实际上是在做,并且只接受你需要的部分。)
话虽如此,我很确定你在这里找错了树:
i need to finish execution before another checkBox is checked
这是在百万项数组上快速测试 .indexOf 的用例;尝试在第一个复选框仍在运行时触发第二个复选框的点击事件:
let firstIsRunning = false;
// make a big random array to search through:
let bigArray = [];
for (var i = 0; i < 1000000; i++) {
bigArray.push(Math.random())
if (i === 500000) {
bigArray.push("TEST") // just so we have something to match
}
}
// run indexOf on that array:
$('#one').on('click', function() {
firstIsRunning = true;
console.log(bigArray.indexOf("TEST"))
firstIsRunning = false;
})
// will log "true" if the first function is still running. (This will never happen.)
$('#two').on('click', function() {
console.log(firstIsRunning)
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<label><input type="checkbox" id="one"> Check me first</label><br>
<label><input type="checkbox" id="two"> then me</label>
即使 .indexOf
实际上不是瞬时的,只要不涉及异步代码,javascript 的单线程性质意味着(few exceptions)第一个事件处理程序将在第二个处理程序开始之前完成。
如果涉及异步代码 ,并且您需要确保一个操作在另一个操作开始之前完成,那么您需要明确地编写代码(通过进行第二个操作等待第一个 Promise 解决)而不是依赖于你能找到的最快算法并希望它足够快。
注意:根据复选框选择触发事件并且有多个复选框,我需要在选中另一个复选框之前完成执行,因此速度是importance.Please帮助并提前感谢
jQuery 的 $.inArray is effectively just a wrapper for vanilla Array.indexOf, when it exists (which it does in all 现代浏览器。)
Underscore 的 _.indexOf 更复杂,包括对某些情况的一些特殊处理——例如,如果数组已经排序,它将使用二进制搜索——因此在某些情况下可能更快。
找出最快的方法是 运行 针对您的真实数据进行性能测试;不同的算法可能更快或更慢,具体取决于它们使用的数据类型。
(同样值得考虑的是,仅仅为了它包含的一个可能更快的函数而包含整个外部库是否合理;除非您已经依赖于该库的其他函数,否则最好看看它是什么库代码实际上是在做,并且只接受你需要的部分。)
话虽如此,我很确定你在这里找错了树:
i need to finish execution before another checkBox is checked
这是在百万项数组上快速测试 .indexOf 的用例;尝试在第一个复选框仍在运行时触发第二个复选框的点击事件:
let firstIsRunning = false;
// make a big random array to search through:
let bigArray = [];
for (var i = 0; i < 1000000; i++) {
bigArray.push(Math.random())
if (i === 500000) {
bigArray.push("TEST") // just so we have something to match
}
}
// run indexOf on that array:
$('#one').on('click', function() {
firstIsRunning = true;
console.log(bigArray.indexOf("TEST"))
firstIsRunning = false;
})
// will log "true" if the first function is still running. (This will never happen.)
$('#two').on('click', function() {
console.log(firstIsRunning)
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<label><input type="checkbox" id="one"> Check me first</label><br>
<label><input type="checkbox" id="two"> then me</label>
即使 .indexOf
实际上不是瞬时的,只要不涉及异步代码,javascript 的单线程性质意味着(few exceptions)第一个事件处理程序将在第二个处理程序开始之前完成。
如果涉及异步代码 ,并且您需要确保一个操作在另一个操作开始之前完成,那么您需要明确地编写代码(通过进行第二个操作等待第一个 Promise 解决)而不是依赖于你能找到的最快算法并希望它足够快。