首页 > 编程语言 >C++ 性能反向优化——用哈希表消除if else导致的性能降低。

C++ 性能反向优化——用哈希表消除if else导致的性能降低。

时间:2023-03-08 15:00:09浏览次数:35  
标签:clock ++ 性能 C++ else int 哈希 void

从代码整洁的角度考虑,对于不同的值将调用相同参数的不同函数,我们通常可以通过建立从值到对应函数指针的哈希表,从而将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

相关文章

  • C++ 基础
    基础程序语言分为低级语言(机器语言、汇编语言)中级语言高级语言(C、C++等)。C++语言的主要特点兼容C语言面向对象(继承和多态)引进了类和对象的概念C++的基本......
  • C++自定义比较函数的bug
    autocmp=[](intx,inty){returntrue;};priority_queue<int,vector<int>,cmp>q;报错第三个参数失配,需要一个类型,而不是对象。平时用sort直接传cmp习惯了,才发......
  • ℬ悟透C++┇Puzzle记录
    C++Puzzles★1.有如下代码,问:ptr指向了谁?能通过ptr调用Derived类重写的函数吗(即多态还起作用吗)?dynamic_cast到底是什么作用?ptr2与ptr性质是一样的吗?Derived*derived=ne......
  • 大数科学计算器 C++
    大数计算器目录大数计算器优点实现思路自定义类MyNum类★★★Method类具体函数实现MyNum类的函数构造&三大函数数学函数转换函数运算符重载显示函数Method类的函数构......
  • Java分布式应用:性能调优
    第五部分性能调优性能瓶颈的表象:1.资源消耗过多、外部处理系统的性能不足2.资源消耗不多,但程序的响应速度不够关于CPU通常使用时间片、多核的方法达到对CPU的分割;每个C......
  • C++ primer StrBlobPtr和StrBlobPtr
    1#include<iostream>2#include<stdio.h>3#include<string>4#include<memory>5#include<algorithm>6#include<initializer_list>7#inclu......
  • MYSQL性能优化的最佳20+条经验
    MYSQL性能优化的最佳20+条经验 2009年11月27日  陈皓 评论 169条评论  254,080人阅读今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其......
  • C++11 thread_local关键字
    这是一篇科普文--关于thread_local关键字首先,C++11之前并没有对并发进行任何的支持,C++11首次提供了以下的支持:语言核心定义了一个内存模型,保证当更改"被两个不同线程使......
  • fio磁盘性能测试
    目前主流的第三方IO测试工具有fio、iometer和Orion,这三种工具各有千秋。fio在Linux系统下使用比较方便,iometer在window系统下使用比较方便,Orion是oracle的IO测试软件,可在......
  • 第一个C程序:如何在DevC++中编辑、编译和运行程序
    第一步:打开DevC++程序,选择文件——新建——源代码 第二步:保证输入法在英文状态下输入代码 第三步:保存文件,保存的时候选择.c文件格式 保存完之后*号消失 ......