- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
所以我想使用这样的 switch 语句:
switch (scrollLeft) {
case (<1000):
//do stuff
break;
case (>1000 && <2000):
//do stuff
break;
}
<1000
)或(
>1000 && <2000
)中的任何一个都不起作用(显然出于不同的原因)。我要问的是最有效的方法来做到这一点。我讨厌使用 30
if
语句,所以我宁愿使用 switch 语法。有什么我可以做的吗?
最佳答案
当我查看其他答案中的解决方案时,我看到了一些我知道对性能不利的事情。我打算将它们放在评论中,但我认为最好对其进行基准测试并分享结果。您可以 test it yourself .以下是我在每个浏览器中以最快速度运行后标准化的结果 (ymmv)。
这是 2021-MAY-05 的结果
测试
Chrome 合金
火狐
歌剧
边缘
勇敢的
节点
1.0 次
15 毫秒
14 毫秒
17 毫秒
17 毫秒
16 毫秒
14 毫秒
如果立即
1.00
1.00
1.00
1.00
1.00
1.00
如果间接
2.20
1.21
2.06
2.18
2.19
1.93
立即切换
2.07
1.43
1.71
1.71
2.19
1.93
开关量程
3.60
2.00
2.47
2.65
2.88
2.86
开关范围2
2.07
1.36
1.82
1.71
1.94
1.79
开关间接阵列
2.93
1.57
2.53
2.47
2.75
2.50
阵列线性开关
2.73
3.29
2.12
2.12
2.38
2.50
阵列二进制开关
5.80
6.07
5.24
5.24
5.44
5.37
2021 年的测试在 64 位 Windows 10 和以下版本上执行:Chrome 90.0.4430.212、Firefox 89.0b13、Opera 76.0.4017.123、Edge 90.0.818.62、Brave 1.24.85 和在 Node (16) 下运行的 WSL (W)
Apple 没有为 Windows 更新 Safari,所以它仍然是 5.1.7。我在这次测试中将其更改为 Brave。
以下是 2012 年 9 月 4 日的结果,用于历史比较:
测试
Chrome 合金
火狐
歌剧
微信公众平台
苹果浏览器
节点
1.0 次
37 毫秒
73 毫秒
68 毫秒
184 毫秒
73 毫秒
21 毫秒
如果立即
1.0
1.0
1.0
2.6
1.0
1.0
如果间接
1.2
1.8
3.3
3.8
2.6
1.0
立即切换
2.0
1.1
2.0
1.0
2.8
1.3
开关量程
38.1
10.6
2.6
7.3
20.9
10.4
开关范围2
31.9
8.3
2.0
4.5
9.5
6.9
开关间接阵列
35.2
9.6
4.2
5.5
10.7
8.6
阵列线性开关
3.6
4.1
4.5
10.0
4.7
2.7
阵列二进制开关
7.8
6.7
9.5
16.0
15.0
4.9
2012 年的测试在 32 位 Windows 7 和以下版本上执行:Chrome 21.0.1180.89m、Firefox 15.0、Opera 12.02、MSIE 9.0.8112、Safari 5.1.7。 Node 在 Linux 64 位机器上运行,因为 Node for Windows 上的计时器分辨率是 10 毫秒而不是 1 毫秒。
如果立即
这是所有测试环境中最快的方法,除了...鼓声 MSIE! (惊喜,惊喜)。
这是实现它的推荐方法。
if (val < 1000) { /*do something */ } else
if (val < 2000) { /*do something */ } else
...
if (val < 30000) { /*do something */ } else
如果间接
switch-indirect-array
的变体但与
if
-statements 而不是,并且在所有经过测试的引擎中都更快。
values=[
1000, 2000, ... 30000
];
if (val < values[0]) { /* do something */ } else
if (val < values[1]) { /* do something */ } else
...
if (val < values[29]) { /* do something */ } else
立即切换
if-immediate
慢 40-120%(2012 年:0-180%) ,除了在 MSIE 中它实际上是最快的。
switch (Math.floor(val/1000)) {
case 0: /* do something */ break;
case 1: /* do something */ break;
...
case 29: /* do something */ break;
}
开关量程
switch (true) {
case (0 <= val && val < 1000): /* do something */ break;
case (1000 <= val && val < 2000): /* do something */ break;
...
case (29000 <= val && val < 30000): /* do something */ break;
}
开关范围2
switch-range
的变体但每个案例只有一个比较,因此更快。
switch (true) {
case (val < 1000): /* do something */ break;
case (val < 2000): /* do something */ break;
...
case (val < 30000): /* do something */ break;
}
开关间接阵列
values=[1000, 2000 ... 29000, 30000];
switch(true) {
case (val < values[0]): /* do something */ break;
case (val < values[1]): /* do something */ break;
...
case (val < values[29]): /* do something */ break;
}
数组线性搜索
values=[1000, 2000 ... 29000, 30000];
for (sidx=0, slen=values.length; sidx < slen; ++sidx) {
if (val < values[sidx]) break;
}
switch (sidx) {
case 0: /* do something */ break;
case 1: /* do something */ break;
...
case 29: /* do something */ break;
}
阵列二进制开关
array-linear-switch
的变体但是使用二进制搜索。
values=[0, 1000, 2000 ... 29000, 30000];
while(range) {
range = Math.floor( (smax - smin) / 2 );
sidx = smin + range;
if ( val < values[sidx] ) { smax = sidx; } else { smin = sidx; }
}
switch (sidx) {
case 0: /* do something */ break;
...
case 29: /* do something */ break;
}
结论
if
-声明或
switch
,具有即时值。
关于javascript - 大于/小于的 switch 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6665997/
问题:如果联接表的属性大于/小于值,是否可以在散列条件下进行测试 例如:测试 Actor 年龄是否大于年龄变量: 是否可以写而不是 ARRAY CONDITION 的: ageVariable = 3
这个问题已经有答案了: How to check if a number is between two values? (12 个回答) 已关闭 6 年前。 我目前正在 Codecademy 上学习
我想知道是否有一种方法可以比较 arrayList 中的连续元素。我有这个 for (int j=0; j< Index.size(); j++) { if(Index.get(j) < Ind
我正在压缩一些代码,现在我有 4 种方法,它们几乎都做同样的事情,除了 for 循环的建模有点不同。我正在传递 int 的 up , down , right ,和left作为这个紧凑方法的参数,这与
SELECT DISTINCT s.sname, s.sid FROM student s, class c WHERE s.programme = 'CS' AND s.level = '2' AN
我正在尝试通过命令行读取文件名, 这是教授要我们输入的命令: java MultiBinaryClient xxxxxx.edu 6001 < files.txt 我正在尝试使用 args[3]获取文
在 C# 中,您可能会看到以下内容: [] 或类似的行(但没有大于/小于符号): [assembly: AssemblyTitle("MyProject")] 我知道第一个称为属性(它有 gt 和 l
我只是想知道大于/小于的结果是如何计算并返回给高级语言的。 我在这里寻找硬件门模型。 让我们用一个统一的例子来解释,比如说5 > 3。 最佳答案 它通常通过带有进位检测的减法来实现。 从门控的角度来看
这个问题在这里已经有了答案: strange output in comparison of float with float literal (8 个答案) 关闭 8 年前。 案例一 float
你到底如何检查一个数字属性是否小于 Apache Ant? 从我所看到的(我是 Ant 的新手)你只能做 ? 最佳答案 您可以使用 (见 http://ant.apa
在 C 中使用 float.h 我想知道如何找到最大的数字,如果我加到 1,答案将保持为 1。 即 1 + x = 1 如何找到 x? 最佳答案 如果你想要“小于 FLT_EPSILON 的最大数字”
我正在尝试查询节点统计信息端点(_nodes / stats)并收到此错误: {"error":{"root_cause":[{"type":"illegal_argument_exception",
有没有更快的方法来检查列表中的项目是否大于、小于或等于某个数字? 或者你只需要循环它?我只是好奇是否有为此预先构建的函数。 示例: 列表包含 5、5、10、15、15、20。 我想检查是否有多少个
因此,我必须编写一个代码,从用户那里获取 2 个日期(月/日/年),如果第一个日期小于第二个日期,则返回“true”。在任何其他情况下,日期将为“假”或“它们是相同的”。我被告知我不能要求用户执行指定
我有两个变量,如果它们的值彼此相差在 5 个数字以内,我想触发一些代码。不知道哪个变量具有更高的值,我可以这样做: if (var1 > var2) { if ((var1 - var2) < 5
我有一个函数,它接受一个对象并将其转换为字节数组: public static byte[] serialize(Object obj) throws IOException { try(By
下载大小已经低于 4MB 的应用程序是否也可以作为免安装应用程序未经修改地分发? 最佳答案 要将该应用程序作为免安装应用程序提供,仍需采取一些步骤。参见 http://g.co/instantapps
我有以下 SELECT 但无法正常工作: SELECT COUNT(userid) FROM login WHERE 17 YEAR(DATE_SUB(NOW(), INTERVAL TO_DAYS
我制作了一个脚本,其中 #hsz-wrap2 附加到最后一个可见的 div,当 div 数量低于或等于 16 在 #snapshot_vertical div 内。 但是,if 条件的工作方式我不明白
我在外部的一排内放置了一个 Logo 、一个搜索框和一个语言栏,并位于 Bootstrap 导航栏上方。这一行当然仍在主容器中,但它包含我提到的 3 个元素——我和我的客户认为这 3 个元素独立于导航
我是一名优秀的程序员,十分优秀!