gpt4 book ai didi

c++ - 用 bool 逻辑替换 IF 语句(随机条件) - 执行时间是否相同?

转载 作者:行者123 更新时间:2023-11-28 02:46:59 26 4
gpt4 key购买 nike

(设置:Win 7 64、MSVC、第三代酷睿 i7、64 位编译、启用 -O2)

下面的代码有三个功能——一个有一个 IF 语句,它根据是否满足条件执行不同的代码。我用一些 bool 逻辑替换了这个 IF 语句。然而,时间是相同的......我期待缺乏分支预测来产生更快的代码:

#include <iostream>

unsigned long long iterations = 1000000000;

void test1(){
volatile int c = 0;

for(int i=0; i<iterations; i++){
bool condition = __rdtsc() % 2 == 0;
if(condition){
c = 4;
}
else{
c = 5;
}
}
}

void test2(){
volatile int c = 0;

for(int i=0; i<iterations; i++){
bool condition = __rdtsc() % 2 == 0;
c = (4 * condition) + (5 * !condition);
}
}

int main(){
unsigned long long s = 0;
unsigned long long f = 0;
unsigned long long s2 = 0;
unsigned long long f2 = 0;
unsigned int x = 0;
unsigned int y = 0;

start = __rdtscp(&x);
test1();
finish = __rdtscp(&y);

start2 = __rdtscp(&x);
test2();
finish2 = __rdtscp(&y);

std::cout << "1: " << f - s<< std::endl;
std::cout << "2: " << f2- s2<< std::endl;
}

更新汇编:

int main(){
push rbp
push rsi
push rdi
push r14
sub rsp,20h
unsigned long long start = 0;
unsigned long long finish = 0;
unsigned long long start2 = 0;
unsigned long long finish2 = 0;
unsigned long long start3 = 0;
unsigned long long finish3 = 0;
unsigned int x = 0;
xor r8d,r8d
mov dword ptr [x],r8d
unsigned int y = 0;
mov dword ptr [y],r8d

start = __rdtscp(&x);
rdtscp
lea r9,[x]
shl rdx,20h
mov dword ptr [r9],ecx
or rax,rdx
test1();
mov dword ptr [rsp+60h],r8d
mov ecx,r8d

start = __rdtscp(&x);
mov r10,rax
nop word ptr [rax+rax]
test1();
rdtsc
shl rdx,20h
or rax,rdx
xor al,0FFh
and al,1
neg al
sbb eax,eax
inc ecx
add eax,5
mov dword ptr [rsp+60h],eax
movsxd rax,ecx
cmp rax,3E8h
test1();
jb main+40h (013FFE1280h)
finish = __rdtscp(&y);
rdtscp
lea r9,[y]
shl rdx,20h
or rax,rdx
mov dword ptr [r9],ecx
mov rbp,rax

start2 = __rdtscp(&x);
rdtscp
lea r9,[x]
shl rdx,20h
mov dword ptr [r9],ecx
or rax,rdx
test2();
mov dword ptr [rsp+60h],r8d
mov r9d,r8d

start2 = __rdtscp(&x);
mov r14,rax
nop word ptr [rax+rax]
test2();
rdtsc
shl rdx,20h
inc r9d
or rax,rdx
xor al,0FFh
and al,1
test2();
movzx ecx,al
lea eax,[rcx+rcx*8]
mov dword ptr [rsp+60h],eax
movsxd rax,r9d
cmp rax,3E8h
jb main+0A0h (013FFE12E0h)
finish2 = __rdtscp(&y);

最佳答案

生成的代码不包含任何函数的任何内部分支,这就是没有错误预测惩罚的原因。

在第一个中,它将 bool 值转换为零或 -1(围绕 sbb eax,eax)并将其加到 5。这是使用 bool 值时非常标准的优化。

在第二个中它乘以九 (rcx+rcx*8),因为你有 5 * condition 而不是 5 * !condition.

关于c++ - 用 bool 逻辑替换 IF 语句(随机条件) - 执行时间是否相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24098275/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com