别人的经验就是我们的阶梯!今天和同事一起调整了代码,定位到了一个非常耗时的地方。在一个线程中,需要保证同步周期在2毫秒以内(如果小于2毫秒,则让其余时间为sleep)。但是在调用模块内部函数时,时不时漂移到3~5毫秒,时间抖动就没法保证了。后来仔细分析调用的函数发现,在链表中搜索目标节点时,由于目标节点的不确定性,需要时间来回漂移。后来想到能不能用“哨兵”的思路来解决问题,就试了一下,果然成功了。这里特分享一下,用2段代码看看代码执行效率的提升。所谓普通算法的哨兵就是一个标志,一个与搜索目标对象相同的操作对象。以前书上有这样一个例子:假设有10000个纸箱,每个箱子里都有一张纸条,纸条上写着1到10000的数字,数字不一样。会重复。现在:有人给了一个随机数,我们要在这10000个箱子里找到和这个数字相同的纸条,找到后退出操作。面对这个问题,最直观的想法是:从头开始,遍历这10000个箱子,检查纸条上的数字是否和目标一致。因为纸箱里的纸币没有按顺序排列,只能从头开始遍历;它看起来像这样:intlookfor_num=xxx;for(inti=0;i<10000;++i){if(box[i]==lookfor_num){printf("找到了!箱子号是:%d\n",i);休息;}}从上面的原理图代码可以看出,在for循环中主要有两条比较指令:比较第i个盒子是否已经到了最后一个盒子;比较箱内纸币上的数字是否与要查找的目标数字相同;为了方便量化问题,我们写了一个测试代码,打印出for循环的耗时。为了便于客观对比,在测试代码中:循环次数设置为500万次;箱内纸条上的数字按顺序存放,不影响讨论问题的本质;将要搜索的数字设置为中间值500,000;测试文件:loop1.c。#include
