我想知道以下代码编译成程序集的方式是否有任何不同.我听说switch-case比if else更有效,但在这个例子中我不太确定是否会出现这种情况.
if(x==1){
...
}else if(x==2){
...
}else{
...
}
Run Code Online (Sandbox Code Playgroud)
和
switch(x){
case 1:
...
break;
case 2:
...
break;
default:
...
}
Run Code Online (Sandbox Code Playgroud) 开关似乎没那么无用,因为它们可以用if-else语句替换,它可以做的不仅仅是匹配一个char/int/enum等.我只能想到一个很好用于一个开关,那将是解释命令线args.
switch语句有哪些实际用途?
在为另一个问题编写查询表相关的答案时,我想起了一些我一直想知道的事情:在函数旁边找到函数所需的少量非代码数据是否明智,而不是传统的方法把它放在另一个部分?
假设您有一个小函数,它使用一个小的只读查找表.通常的方法似乎是将查找表定位在数据部分中,例如.rodata通常将其放置在距函数本身的文本一定距离处.
例如,一个使用16项LUT计算字节奇偶校验的简单函数:
GLOBAL parity
SECTION .text
parity:
mov eax, edi
shr edi, 4
xor eax, edi
and eax, 15
movzx eax, byte [lut + eax]
ret
SECTION .rodata
lut:
db 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1
Run Code Online (Sandbox Code Playgroud)
现在,该方法恰好是大约16个字节的代码,查找表也是16个字节.因此,它们可以很容易地适应相同的缓存行.这看起来像是一个双赢 - lut 总是在函数中访问,并且只能由函数访问,因此我们可以通过放置代码和代码来降低调用此函数的成本.数据并排:
GLOBAL parity
SECTION .text
parity:
mov eax, edi
shr edi, 4
xor eax, edi
and eax, 15
movzx eax, byte [lut + …Run Code Online (Sandbox Code Playgroud) 假设我有一个if/else-if链:
if( x.GetId() == 1 )
{
}
else if( x.GetId() == 2 )
{
}
// ... 50 more else if statements
Run Code Online (Sandbox Code Playgroud)
我想知道的是,如果我保留地图,它在性能方面会更好吗?(假设键是整数)
通常,使用if块和其他许多ifs与switch case block相比有什么性能差异?某些语言或风格约定更喜欢一个吗?
具体来说,我对Matlab,C和C++很好奇
language-agnostic performance if-statement switch-statement conditional-statements
我有一个问题,关于是否在一个被调用很多的函数中使用'case'或'ifs'.现在是'ifs'中的以下内容; 代码不言自明:
int identifyMsg(char* textbuff) {
if (!strcmp(textbuff,"text")) {
return 1;
}
if (!strcmp(textbuff,"name")) {
return 2;
}
if (!strcmp(textbuff,"list")) {
return 3;
}
if (!strcmp(textbuff,"remv")) {
return 4;
}
if (!strcmp(textbuff,"ipad")) {
return 5;
}
if (!strcmp(textbuff,"iprm")) {
return 6;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:开关性能会更好吗?我知道如果使用'ifs',我可以将最有可能的选项放在顶部.
我在StackOverflow上读到了这个
if(someCondition)
{
someCode();
}
else
{
alternateCode();
}
Run Code Online (Sandbox Code Playgroud)
由于易受分支错误预测的影响,效率可能很低(例如,请参阅此问题).
所以是一个switch构造,例如,
switch (someCondition)
{
case (someCase):
something();
break;
case (otherCase):
someOtherInstructions();
break;
default:
defaultAction();
break;
}
Run Code Online (Sandbox Code Playgroud)
在这方面有什么不同(除了我允许三种可能性的事实)?
language-agnostic optimization performance compiler-optimization branch-prediction
我想知道使用if语句或switch之间是否存在任何效率差异.例如:
if(){
//code
}
else if(){
//code
}
else{
//code
}
Run Code Online (Sandbox Code Playgroud)
我相信程序需要去检查所有if语句,即使第一个if语句是真的.
switch(i){
case 1:
//code
break;
case 2:
//code
break;
Run Code Online (Sandbox Code Playgroud)
但是在交换机中,有一个break命令.我接近了吗?如果没有,你能解释一下它们之间的效率差异吗?
该装配项目读取按键并以特定颜色输出它们。当按下一个元音时,它会改变文本的颜色,直到按下另一个元音为止,直到 ESC按下为止。颜色具有一定的模式,这就是为什么sub colorCode, 8当它到达循环结束时。我只是想让它更有效率。我尝试将所有比较语句放入一行,但没有成功。
INCLUDE Macros.inc
INCLUDE Irvine32.inc
INCLUDELIB Irvine32.lib
.386
.STACK 4096
ExitProcess PROTO, dwExitCode:DWORD
.DATA
key BYTE ?
colorCode BYTE 5
max BYTE 13
.CODE
main PROC
FindKey:
mov EAX, 50
call Delay
call ReadKey
jz FindKey
MOV key, AL
cmp key, 75h
JE UP
CMP key, 6Fh
JE UP
CMP key, 69h
JE UP
CMP key, 65h
JE UP
CMP key, 61h
JE UP
CMP key, 55h
JE UP
CMP key, 4Fh
JE UP …Run Code Online (Sandbox Code Playgroud) performance ×5
c++ ×4
if-statement ×4
optimization ×3
assembly ×2
java ×2
x86 ×2
c ×1
c# ×1
compilation ×1
irvine32 ×1
map ×1
masm ×1