javascript - 有没有办法在循环内使用静态 if 语句来节省处理周期?
问题描述
考虑这个代码片段:
var x = 10;
for (var i=0; i<100; i++) {
if (x === 10) {
/* do some stuff */
}
}
if 语句中的条件是静态的,除了x
,它的值在进入循环之前只计算一次。这个值可以来自任何地方——它可以是硬编码的、用户的输入、数学问题的结果等。关键是一旦x
被评估,它就不会改变。因此,if 语句中的条件在每次循环迭代时都是相同的,但是代码仍然清楚地评估了条件,从而在过程中浪费了处理周期。有没有办法让条件评估一次,然后让每次迭代立即执行正确的代码分支?
解决方案
一种选择是提前保存条件,这样就不需要x
每次都重新检查:
var x = 10;
var doCondition = x === 10;
for (var i=0; i<100; i++) {
if (doCondition) {
/* do some stuff */
}
}
另一种选择是有两个单独的函数,一个用于是否满足条件,一个用于不满足条件。它会是 WET,但条件只会被评估一次。例如,你可以转
var x = 10;
var doCondition = x === 10;
for (var i=0; i<100; i++) {
if (doCondition) {
/* do some stuff */
} else {
// do some other stuff
}
}
进入
const fns = {
trueCond() {
for (var i=0; i<100; i++) {
// do some stuff
}
},
falseCond() {
for (var i=0; i<100; i++) {
// do some other stuff
}
}
// insert other conditions here, if you want
// could also just use if/else statements containing loops,
// rather than an object of functions
};
const fn = x === 10 ? fns.trueCond : fns.falseCond;
fn();
这取决于循环的复杂程度/正在执行的其他操作。
尽管如此,这几乎总是过早优化的情况——如果您担心性能,请先运行性能测试,如果您发现速度很慢,请确定代码较慢的区域并改进它。循环中的条件可能不会是最慢的区域。
推荐阅读
- python - 传递给类的 SQLAlchemy 对象丢失更改
- arrays - 错误:线程 1:信号 SIGABRT(在数组中附加元素时)
- xml - 压缩包含 base64 数据的 XML
- matlab - 如何在 MATLAB 中提取 3D 数组元素的随机位移强度差异?
- python - 运行工艺安装时未定义命令“键”
- reactjs - react中过滤数据后如何更新分页
- android - 将数据从节点 js 传递到 android 以拨打电话?
- excel - 创建列如下
- kubernetes - 待处理的消息暴露 externalApi
- tomcat7 - Worklight 到 tomcat 的迁移