当前位置:C++技术网 > 资讯 > 简单的思维转换就给程序大提速,引入缓存技术就好了

简单的思维转换就给程序大提速,引入缓存技术就好了

更新时间:2017-03-20 11:59:13浏览次数:1+次

    缓存Cache,是一种加快存取速度的技术。我们在学习计算机时,了解到CPU有缓存,而且还有好几级。内存也有缓存,叫做页交换文件。显卡也有缓存,可以加速显示。缓存其实无处不在,但是你的程序里有吗?
    其实缓存并不是一个什么了不起的东西。缓存只是一种思想而已。如果使用得当,可以大大加速程序的性能。
    上周周末,我对C++技术网(www.cjjjs.com)做了一次大提速。在多个地方使用了缓存,速度大大提高。而之前每次都是直接加载,每次都从数据源里获取数据并显示。因为网站的框架是我自己写的,所以没有现成的机制利用。而加载速度一直都是网站的一大问题。这也导致百度蜘蛛在获取网页时经常超时,一直没有好转过。原因在于网站越来越受欢迎,流量变大了,所以服务器压力也变大了,响应也就变慢了。当然,对于用户来讲,速度还是挺快的,只是对于蜘蛛来讲,还是不够的。

    我下面来讲讲缓存实现的思路,供大家熟悉缓存技术,希望大家以后也尽可能多的将缓存技术应用于自己的程序,提高程序的性能。

简单的思维转换就给程序大提速,引入缓存技术就好了

    对于网站的提速,我是真真切切的感受到了缓存的威力,太给力了。原先一个页面加载要220ms,提速后,只需要65ms。而如果再要提速,则改进不会太大了,因为现在的瓶颈在于内存了。提速还是可以的,那就是优化程序的结构流程,优化细节,还是可以提速10ms的样子。因为后面我提速到了55ms。
    其实使用缓存技术也就是一个开发思维的转变。我们需要的数据,如果长时间保持不变,那么就要用缓存来做一下。这个得益于我在调整菜单策略,然后必须使用缓存来解决速度问题。关于菜单的实现分析文章,请阅读《关于网站菜单分类以配置文件还是数据库方式实现的综合讨论》。因为原先的菜单是固定写死的,如果后续调整,改起来很麻烦,引起了不同步的问题。但是如果动态加载,那么因为长期不变,所以,每次加载很影响性能。所以才不得不使用内存缓存来解决这个问题。
    也正是因为菜单的缓存使用,也就顺便用到了其他的各个地方,一次性改造下来,发现效果真的挺好。只是,使用了缓存技术之后,对于原有的开发的功能有一定的影响,需要做同步的改进。使用了缓存的实现方式和之前的确实还是有很多的差异。这个如果不自己尝试一遍,不容易体会到。
    下面来用代码来演示下缓存的实现思路。
1.没有用缓存技术
void show_page()
{
 int id1=0,id2=1;
 string str = GetDataFromDB(id1,id2);
 cout<<str;
}

string GetDataFromDB(int id1,int id2)
{
 //下面是自己封装的从数据库获取数据的类和操作流程演示
 string ret;
 CMySql db_op;
 DataSet ds = db_op.GetDataSet();
 int count = db_op.GetRowCount(ds);
 for(int i=0;i<count;i++)
 {
 ret += db_op.GetField(i);
 }
 return ret;
}
    以上就是直接从数据库获取数据,并显示出来的过程演示。具体的数据库操作就不提供演示代码了。以上代码只是演示,如果要实际运行,请自己写出完整的代码哦。
    直接显示数据,每次要从数据库获取数据。而数据库一般要通过网络,数据库本身还有一系列的查询操作。如果这些数据长时间不会改变,那么每次显示则会非常低效。
    当然,一般写代码也就这样了。我们很少去关注缓存,也很少会想着去用缓存来改善代码。而这种使用缓存改善代码的优化,不是代码本身的优化,而是一种思维模式的改善。如果你没有这个思维,你怎么也写不出来这样的代码,虽然这样的改进可以很简单。这也是高手的代码和新手的代码的差别。看上去代码差不多,人家的代码效率贼高,而你的就贼低,而且你还不知道为什么。所以,我是希望大家引起重视,需要多多学习别人代码的思想,可以多学习一下新思想。成为大神,是从思想上,而不是编码上。当然,编码是基础,从编码去理解思想。

    其实我之前也都是没有这么去关注代码的思想运用问题。看来这是给我自己一个很大的启示,以后要多加注意,可以有很大的提升了。似乎砸开了一个通向大神的路口,哈哈哈。这也是成长的一个必须经历的过程。不过分享之后,你可以借鉴,可以更早的进入这个路口。

2.使用缓存技术

    下面来看看使用缓存技术,应该如何做?
static string g_content="";//全局缓存字符串
void show_page()
{
 if(g_content=="")
 {
 int id1=0,id2=1;
 g_content = GetDataFromDB(id1,id2);
 }
 cout<<g_content;
}

string GetDataFromDB(int id1,int id2)
{
 //下面是自己封装的从数据库获取数据的类和操作流程演示
 string ret;
 CMySql db_op;
 DataSet ds = db_op.GetDataSet();
 int count = db_op.GetRowCount(ds);
 for(int i=0;i<count;i++)
 {
 ret += db_op.GetField(i);
 }
 return ret;
}
    好了。改进完毕。是不是觉得很无语。缓存就这么简单。当然这只是一个演示,根据不同的数据,缓存会有不同的实现,这就不细说。但是这里演示出来缓存的流程。
    首先要有一个缓存存储空间,这里就是全局变量字符串。然后你要检测缓存的状态,如果缓存为空,那么就要将数据新增到缓存里;如果缓存过时了,那么就要将最新的数据更新到缓存里。如果缓存有而且是最新的,那么就直接显示。这样就可以达到缓存的效果。因为缓存的原因,我们重复的获取就不存在了,大量的存取在内存里就得到了,避开了网络和IO的开销,性能可以得到极大的提升。
    当然,这里只是缓存技术的一个入口。其实需要处理的问题还是有很多的。因为缓存技术使用之后,你需要控制缓存策略,比如过期策略,要支持手动刷新缓存,是定点刷新还是全部刷新,缓存的内容的更新策略,缓存格式等等。
    可以说,在代码中引进缓存,并不是很难的事情,相反,太简单了。轻轻松松可以提升程序的性能,为什么不做呢?不做的原因就是你从未想过可以这样做。如果你知道这个好处,你不做都有点忍不住吧。这就仅仅是一个思维的问题。
    当然,缓存到处都可以用,比如文件操作、网络操作、大量计算操作、用变量存储函数的结果而不是每次调用函数获取等等,都可以加速程序的速度。
    缓存技术就是一个思维,就是一个习惯,你实现了,你的程序性能绝对不会很低。