问题描述
通过小表循环(该表有 1 到 3 个条目)或通过使用 if
语句检查第二个表(该表要大得多,可以有数百个条目)。
循环表:
for (var i = 0; i < TableA.length; i++) {
if (TableA[i].x1 < x && TableA[i].x2 < x && TableA[i].y1 < y && TableA[i].y2 < y then) {
// process ..
break;
}
}
if 语句:
if (tableB[x][y] == true) {
// process ..
}
我的猜测是带有 if
语句的选项更快,但缺点是更大的表需要内存。
解决方法
说到实际性能,这通常是一个艰难的游戏,您应该分析您的代码以检查在两种建议方法之一中是否存在巨大的惩罚。
if 语句 是一个 O(1) 而循环表 是一个 O(n),但是正如您已经说过的 n 真的很小(1 到 3),所以很难说哪个版本更快。
这在很大程度上取决于 tableB 的大小:如果表非常大,它可能不适合 CPU 缓存,因此访问可能涉及通过 RAM(或较慢的 CPU 缓存),虽然代码仍然是 O(1),但内存访问主导了计算时间。另一方面,tableA 很小,if 语句中涉及的算术运算很容易,对于 CPU 性能来说可以忽略不计(取决于 CPU 的架构)。
因此,我的建议是使用真实数据集分析您的代码,以了解是否存在值得优化的性能差异。如果差异足够小,我同意用户 helvete 的意见,我会选择循环方式,以便更加面向未来。
很多年前,我曾经花费大量时间来优化不值得的代码,导致脏代码库更难以维护。现在我经常想起自己下面的引用:
过早优化是万恶之源