zoukankan      html  css  js  c++  java
  • 拒绝switch,程序加速之函数指针数组

    先看一个使用switch语句的程序:

    #include <stdio.h>
    #include <time.h>
    
    //加法
    int add(int a,int b)
    {
    	return a+b;
    }
    
    //减法
    int subtract(int a,int b)
    {
    	return a-b;
    }
    
    //乘法
    int multi(int a,int b)
    {
    	return a*b;
    }
    
    //除法
    int divide(int a,int b)
    {
    	return a/b;
    }
    
    int claculate(int a,int b,char oper)
    {
    	//这里使用switch语句
    	switch (oper)
    	{
    	case '+':
    		return add(a,b);
    	case '-':
    		return subtract(a,b);
    	case '*':
    		return multi(a,b);
    	case '/':
    		return divide(a,b);
    	default:
    		return -1;
    		break;
    	}
    }
    
    
    void main()
    {
    	int a = 250;
    	int b = 5;
    	//统计程序执行时间
    	clock_t start, finish; 
    	start = clock();
    	printf("%d
    ",claculate(a,b,'+'));
    	printf("%d
    ",claculate(a,b,'-'));
    	printf("%d
    ",claculate(a,b,'*'));
    	printf("%d
    ",claculate(a,b,'/'));
    	finish = clock();
    	printf( "%f seconds
    ", (double)(finish - start) / CLOCKS_PER_SEC );  
    }
    
    再看一个使用函数指针数组的程序
    #include <stdio.h>
    #include <time.h>
    
    //加法
    int add(int a,int b)
    {
    	return a+b;
    }
    
    //减法
    int subtract(int a,int b)
    {
    	return a-b;
    }
    
    //乘法
    int multi(int a,int b)
    {
    	return a*b;
    }
    
    //除法
    int divide(int a,int b)
    {
    	return a/b;
    }
    
    
    
    int claculate(int a,int b,int oper)
    {
    	//事实上这里应该使用hashMap。将字符'+'映射到add函数。

    //直接使用数字是为了简便 //声明指向函数指针的数组 int (*pfunc[])(int a,int b) = {add,subtract,multi,divide}; return pfunc[oper](a,b); } void main() { int a = 250; int b = 5; //统计程序执行时间 clock_t start, finish; start = clock(); printf("%d ",claculate(a,b,0)); printf("%d ",claculate(a,b,1)); printf("%d ",claculate(a,b,2)); printf("%d ",claculate(a,b,3)); finish = clock(); printf( "%f seconds ", (double)(finish - start) / CLOCKS_PER_SEC ); }


    当switch推断语句中case的个数不多时,上面两个程序几乎相同。但假设case非常多时,使用函数指针数组要快非常多。

    类似地。在Java里面也能够使用反射来代替swith语句产生类似的效果。


  • 相关阅读:
    解决Vss链接问题清除Windows共享登录的用户名密码记录(转)
    C# 激活正在运行的程序
    Log4Net 使用方法
    对Javascript闭包的一些理解
    根据数据库获取表名集合,根据表名获取字段信息
    C#引用类型和值类型的区别(转)
    c++强制类型转换:dynamic_cast、const_cast 、static_cast、reinterpret_cast
    理解VC工程文件类型
    MFC中的UpdateData()
    字节对齐
  • 原文地址:https://www.cnblogs.com/lytwajue/p/7093325.html
Copyright © 2011-2022 走看看