从代码整洁的角度考虑,对于不同的值将调用相同参数的不同函数,我们通常可以通过建立从值到对应函数指针的哈希表,从而将if else消除。但实际可能使性能更低,以下是测试例子。
原因在于,if else分支预测不正确虽然可能使指令流水线几条指令执行错误,但通过哈希表的方式,增加了计算哈希值、查询哈希表以及通过函数指针调用的开销,从而可能使得调用过程慢了更多。
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
constexpr int N = 10;
constexpr int COUNT = 1000000000;
long long a = 0;
void targetFunc1(){
for(int i = 0; i < N; i++){
a++;
}
}
void targetFunc2(){
for(int i = 0; i < N; i++){
a++;
}
}
void targetFunc3(){
for(int i = 0; i < N; i++){
a++;
}
}
void targetFunc4(){
for(int i = 0; i < N; i++){
a++;
}
}
void targetFunc5(){
for(int i = 0; i < N; i++){
a++;
}
}
void targetFunc6(){
for(int i = 0; i < N; i++){
a++;
}
}
void func1(int a){
if(a == 1) targetFunc1();
if(a == 2) targetFunc2();
if(a == 3) targetFunc3();
if(a == 4) targetFunc4();
if(a == 5) targetFunc5();
if(a == 6) targetFunc6();
}
std::unordered_map<int, void(*)()> funcs = {
{1, targetFunc1},
{2, targetFunc2},
{3, targetFunc3},
{4, targetFunc4},
{5, targetFunc5},
{6, targetFunc6}
};
void func2(int a){
funcs[a]();
}
void test1(){
clock_t startTimes = clock();
for(int i = 0; i < COUNT; ++i){
int index = rand() % 6 + 1;
func1(index);
}
clock_t endTimes = clock();
std::cout << "cost times 1: " << (endTimes - startTimes) / CLOCKS_PER_SEC << "ms." << std::endl;
}
void test2(){
clock_t startTimes = clock();
for(int i = 0; i < COUNT; ++i){
int index = rand() % 6 + 1;
func2(index);
}
clock_t endTimes = clock();
std::cout << "cost times 2: " << (endTimes - startTimes) / CLOCKS_PER_SEC << "ms." << std::endl;
}
int main()
{
test1();
test2();
std::cout<<a<<std::endl;
return 0;
}
cost times 1: 52ms.
cost times 2: 113ms.
20000000000
标签:clock,++,性能,C++,else,int,哈希,void
From: https://www.cnblogs.com/qiangz/p/17192009.html