建设网站增城,wordpress 自定义缓存,金山办公给我发验证码,WordPress博客程序优化从处理器的角度来说#xff0c;条件分支会导致指令流水线的中断#xff0c;所以控制语句需要严格保存状态#xff0c;因为处理器是很难直接进行逻辑判断的#xff0c;有可能它会执行一段时间#xff0c;发现出错后再返回#xff0c;也有可能通过延时等手段完成控制流的正…从处理器的角度来说条件分支会导致指令流水线的中断所以控制语句需要严格保存状态因为处理器是很难直接进行逻辑判断的有可能它会执行一段时间发现出错后再返回也有可能通过延时等手段完成控制流的正确性。所以笔者在想使用过多的if _else除了可读性差是否还会对执行效率造成影响呢
于是笔者决定采用职责链重构if控制语句笔者猜想如果采用设计模式既可以避免if分支提高执行效率同时可以让程序具备解耦合性和可维护性是否是一种更优解呢
为了验证笔者的猜想更好的优化c语言程序笔者使用职责链模式对一段if_else程序进行了重构。
程序的性能标准是执行时间计算程序时间的程序来源于C语言 计算程序运行时间精确到毫秒/微秒_c语言计算运行时间-CSDN博客
以下是笔者本人用c编写的责任链设计模式
#includestdio.h
#includestdlib.h
#includememory.h
#includestring.h
#include windows.htypedef int (*Handler)(int);typedef struct task_node
{Handler handler;struct task_node* next;
}taskN;int task1(int a) {if (a 1) {//printf(a 1); printf会耗费大量时间为了不影响测试所以只留下判断语句return 0;}return -1;
}int task2(int a) {if (a 2) {return 0;}return -1;
}int task3(int a) {if (a 3) {return 0;}return -1;
}int task4(int a) {if (a 4) {return 0;}return -1;
}int task5(int a) {if (a 5) {return 0;}return -1;
}int task6(int a) {if (a 6) {return 0;}return -1;
}int task7(int a) {if (a 7) {return 0;}return -1;
}int task8(int a) {if (a 8) {return 0;}return -1;
}int task9(int a) {if (a 9) {return 0;}return -1;
}int task10(int a) {if (a 10) {return 0;}return -1;
}int task11(int a) {if (a 11) {return 0;}return -1;
}int task12(int a) {if (a 12) {return 0;}return -1;
}taskN* initi() {taskN* tas1 malloc(sizeof(taskN));taskN* tas2 malloc(sizeof(taskN));taskN* tas3 malloc(sizeof(taskN));taskN* tas4 malloc(sizeof(taskN));taskN* tas5 malloc(sizeof(taskN));taskN* tas6 malloc(sizeof(taskN));taskN* tas7 malloc(sizeof(taskN));taskN* tas8 malloc(sizeof(taskN));taskN* tas9 malloc(sizeof(taskN));taskN* tas10 malloc(sizeof(taskN));taskN* tas11 malloc(sizeof(taskN));taskN* tas12 malloc(sizeof(taskN));tas1-handler task1;tas2-handler task2;tas3-handler task3;tas4-handler task4;tas5-handler task5;tas6-handler task6;tas7-handler task7;tas8-handler task8;tas9-handler task9;tas10-handler task10;tas11-handler task11;tas12-handler task12;tas1-next tas2;tas2-next tas3;tas3-next tas4;tas4-next tas5;tas5-next tas6;tas6-next tas7;tas7-next tas8;tas8-next tas9;tas9-next tas10;tas10-next tas11;tas11-next tas12;return tas1;}void process(taskN* bol, int a) {int i bol-handler(a);while (i ! 0){i bol-handler(a);bol bol-next;}
}void main() {double run_time;LARGE_INTEGER time_start; //开始时间LARGE_INTEGER time_over; //结束时间double dqFreq; //计时器频率LARGE_INTEGER f; //计时器频率QueryPerformanceFrequency(f);dqFreq (double)f.QuadPart;QueryPerformanceCounter(time_start);taskN* bol initi();int a 12;for (int i 0; i 50000000; i){/*if (a 1) {}else if (a 2) {}else if (a 3) {}else if (a 4) {}else if (a 5) {}else if (a 6) {}else if (a 7) {}else if (a 8) {}else if (a 9) {}else if (a 10) {}else if (a 11) {}else if (a 12) {}else {}*//*process(bol, a);*/switch (a) {case 1:break;case 2:break;case 3:break;case 4:break;case 5:break;case 6:break;case 7:break;case 8:break;case 9:break;case 10:break;case 11:break;case 12:break;default:break;}}QueryPerformanceCounter(time_over); //计时结束run_time 1000000 * (time_over.QuadPart - time_start.QuadPart) / dqFreq;//乘以1000000把单位由秒化为微秒精度为1000 000/cpu主频微秒printf(\nrun_time%fus\n, run_time);/*为了偷懒程序就懒得free了*/} 使用if_else时
a1,第一个循环执行 a12,最后一个循环执行 两者时间基本没区别在循环语句中
笔者还测试了只有if( a 1)这一个判断语句下的性能 可以看出基本没什么区别。 使用case时
a12时如下与a1时的结果几乎没有区别 switch语句除了比较简洁一点执行速度完全没法比。 使用责任链时
任务优先级在责任链上过高(a1) 任务优先级在责任链过低a12) 可以看出职责链的速度非常慢特别是任务优先级低时执行速度几乎是if_else的150倍。
综上得出if_else的执行速度是最快的如果判断的时间复杂度过大而且判断语句的数量较少使用if_else性能可能会更好。
但是上述的前提是建立在判断语句的数量较少的情况下。
现在让我们考虑这样一种情况不是判断a从1到12而是从a到10000呢程序等价于下图 再附加一个条件大多数情况下a的值都是1。
虽然if_else的耗时比较短但是在大量的循环下耗时也不容小觑。因为a大多数情况是1其他的判断分支只有小概率发生此时我们使用责任链就可以完美跳过这些语句的判断 程序用for循环表示中间的分支写得不准确理解意思就好
当然读者可能认为if else if在这里也可以跳过中间的语句也能实现优先级但是如果改成这样呢 这种情况下if else if只能执行其中一个显然不行使用大量的if就变成了上面的情况我们不得不将原先的代码大量删除并重写这十分让人难受。这样一对比对于部分实现的if分支使用责任链的优点有什么呢如下图 在责任链任务里进行改动可以选择责任链终止的位置跳过后面的任务当然通过goto等跳转指令也是可以实现的但是if语句很难做到这样灵活对于复杂的业务场景很难在原先的基础上进行拓展责任链的解耦合性和可拓展性是非常好的优点。
考虑复杂的业务场景责任链明显优于传统的if_else。
尽管如此if_else还是十分友好的特别是在mcu等产品的开发中使用设计模式的资源花费简直是奢求毕竟设计模式是针对高级语言的大多数情况下if_else往往是最优解。不过笔者认为大量使用if_else的前提是项目不需要长期维护一般情况下还是要多使用设计模式例如在linux内核中就有源码使用了责任链模式这是从性能解耦合性和可读性等多方面考虑值得开发者学习。如果是小型项目对维护没有要求而且控制语句的数量较少为了性能和简便性可以考虑直接使用if_else分支。但是如果大型项目中含有大量if分支可以考虑使用设计模式重构。