是一种switch说法实际上比更快的if声明?
我使用/Ox标志在Visual Studio 2010的x64 C++编译器上运行下面的代码:
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#define MAX_COUNT (1 << 29)
size_t counter = 0;
size_t testSwitch()
{
clock_t start = clock();
size_t i;
for (i = 0; i < MAX_COUNT; i++)
{
switch (counter % 4 + 1)
{
case 1: counter += 4; break;
case 2: counter += 3; break;
case 3: counter += 2; break;
case 4: counter += 1; break;
}
}
return …Run Code Online (Sandbox Code Playgroud) 我对R中的switch语句有点困惑.只需在googling函数中我得到一个例子,如下所示:
switch的一个常见用途是根据函数的一个参数的字符值进行分支.
> centre <- function(x, type) {
+ switch(type,
+ mean = mean(x),
+ median = median(x),
+ trimmed = mean(x, trim = .1))
+ }
> x <- rcauchy(10)
> centre(x, "mean")
[1] 0.8760325
> centre(x, "median")
[1] 0.5360891
> centre(x, "trimmed")
[1] 0.6086504
Run Code Online (Sandbox Code Playgroud)
然而,这似乎只是if为每个指定了一堆语句type
这就是全部switch()吗?有人可以给我更多的例子和更好的应用吗?
为什么要switch在一系列if语句中使用块?
switch 语句似乎做同样的事情,但需要更长的时间来输入.
我一直想知道这件事已经有一段时间了.我到目前为止还不是一个核心程序员,主要是小型Python脚本,我写了几个分子动力学模拟.对于真正的问题:switch语句有什么意义?你为什么不能只使用if-else语句?
感谢您的回答,如果之前有人询问过,请指向我的链接.
编辑
S.Lott指出,这可能是问题If/Else vs. Switch的重复.如果你想关闭然后这样做.我将把它留待进一步讨论.
我在Java字节码中理解LookUpSwitch和TableSwitch有些困难.
如果我理解得很好,LookUpSwitch和TableSwitch都对应于switchJava源代码的声明?为什么一个JAVA语句生成2个不同的字节码?
每个Jasmin文档:
有没有更好的方法来编写这样的代码:
if (var == "first case" or var == "second case" or var == "third case" or ...)
Run Code Online (Sandbox Code Playgroud)
在Python中我可以写:
if var in ("first case", "second case", "third case", ...)
Run Code Online (Sandbox Code Playgroud)
这也让我有机会轻松通过好的选项列表:
good_values = "first case", "second case", "third case"
if var in good_values
Run Code Online (Sandbox Code Playgroud)
这只是一个例子:类型var可能与字符串不同,但我只对alternative(or)比较(==)感兴趣.var可以是非const,而选项列表在编译时是已知的.
专享奖金:
or==我在Visual Studio 2008上测试了一些代码并注意到了security_cookie.我能理解它的重点,但我不明白这条指令的目的是什么.
rep ret /* REP to avoid AMD branch prediction penalty */
Run Code Online (Sandbox Code Playgroud)
当然我可以理解评论:)但是这个前缀exaclty在上下文中做了ret什么,如果ecx是!= 0 会发生什么?显然,ecx当我调试它时,忽略循环计数,这是预期的.
我发现这里的代码在这里(由编译器注入安全性):
void __declspec(naked) __fastcall __security_check_cookie(UINT_PTR cookie)
{
/* x86 version written in asm to preserve all regs */
__asm {
cmp ecx, __security_cookie
jne failure
rep ret /* REP to avoid AMD branch prediction penalty */
failure:
jmp __report_gsfailure
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个switch案例程序:
升序订单开关案例:
int main()
{
int a, sc = 1;
switch (sc)
{
case 1:
a = 1;
break;
case 2:
a = 2;
break;
}
}
Run Code Online (Sandbox Code Playgroud)
汇编代码:
main:
push rbp
mov rbp, rsp
mov DWORD PTR [rbp-4], 1
mov eax, DWORD PTR [rbp-4]
cmp eax, 1
je .L3
cmp eax, 2
je .L4
jmp .L2
.L3:
mov DWORD PTR [rbp-8], 1
jmp .L2
.L4:
mov DWORD PTR [rbp-8], 2
nop
.L2:
mov eax, 0
pop rbp
ret …Run Code Online (Sandbox Code Playgroud) 我在某处读到该switch语句使用"二进制搜索"或一些排序技术来精确选择正确的情况,与else-if梯形图相比,这增加了它的性能.
如果我们按顺序给出案例,那么交换机的工作速度会更快吗?是这样吗?你能在这个问题上添加宝贵的建议吗?
我们在这里讨论了相同的问题并计划发布作为一个问题.
if-statement ×4
c ×3
assembly ×2
c++ ×2
gcc ×2
performance ×2
bytecode ×1
jasmin ×1
java ×1
jump-table ×1
r ×1
x86 ×1