认识了解数据缓存

很多时候,即使我们对数据库的设计和部署采用了很多性能优化的策略,但是每次读取数据的时候,还是得从数据库中去检索,这不仅仅使i/o操作更加频繁,还导致了很大的网络开销和CPU的开销。网站建设的技术人员应该尽量活跃数据缓存。

如果将请求所需的数据保存在应用服务器的内存中,无疑会对性能提升有很大的帮助!尽管数据库产品(例如SQL Server)在检索数据的时候,已经将数据从磁盘中读取到了内存缓冲中,可由于数据库要处理很多的请求,并且SQL Server会根据相应的策略将数据从缓冲中释放,为其他的请求提供内存缓冲区,而且,在内存中缓存什么数据,缓存多长时间也是根据应用程序的业务而定的,所以,需要我们在程序中使用一定的缓存策略来提升性能!

更新数据依赖关系

代码移动可能会改变运算之间的数据依赖关系。因此在每次代码移动之后都必须更新数据依赖关系。

对x的两个赋值 之一可以被向上移动到顶部的基本块,因为这样的转换保持了原程序中的所有依赖关系。但是,一但我们把其中一个赋值语句上移,就不能再移动另一个。更明确地说,我们看到在代码移动之前顶部的基本块的出口处X是不活跃的,但是在移动之后就变得活跃了。如果一个变量在一个程序点上活跃,那么我们不能把对该变量的投机性定值移动到该程序点的前面。

全局调度算法

我们看到代码移动对某些路径有益,但是会损害另外一些路径的性能。好消息是指令并不是生而平等的。实际上,我们知道,一个程序的90%以上的执行时间被花在不到10%的代码上。因此,我们可以把目标确定为使得频繁执行的路径更快运行,虽然有可能降低不频繁路径的运行速度。

数组数据依赖关系分析

并行化或局部性优化经常对原程序中执行的运算重新排序。和所有的优化一样,只有当对运算的重新排序不会改变程序输出时才可以对这些运算重新排序。一般来说,我们不可能深人理解一个程序到底做了什么,代码优化通常选用一个较简单的、保守的测试方法来决定在什么时候可以肯定程序的输出不会受到优化的影响:检查在原程序中和在修改后的程序中,对同一内存位置的各个运算被执行的顺序是否一样。在当前的研究中,我们关注的是数组访问,因此数组元 素就是需要考虑的内存位置。

如果两个访问(不管是读还是写)指向两个不同的位置,显然它们是相互独立的(可以被重 新排序)。另外,读运算不会改变内存的状态,因此各个读运算之间是独立的。如果两个访问指向同一个内存位置并且其中至少有一个写运算,那么就说这两个访问是数据 依赖的。为了保证修改后的程序和原程序做同样的事情,每一对有数据依赖关系的运算在原程 序中的执行顺序必须在新的程序中得到保持。

选择一种数据存储的方法

如果我们已经了解到了.NET Framework中所使用的关系型数据访问和XML数据访问这两种技术(尽管现在所了解的还只是相当基础的方法),那么我们将如何去选择数据存储方法呢?最简单的答案是有了.NET,我们无需再考虑这类事情了。

几年前,数据存储和访问技术中的主要指令还是那些构造巨大的数据保管机构和数据仓库的管理命令,我们所建立的数据都被存储在一大块中央数据库中。尽管这种方案仍然使用于某些场所,如政府的税务局,但是,当今分布式的计算环境日益清晰地表明这不是一种理想的方案。

数据关键在于访问和处理

事实上,很明显最重要的不是在哪里存储,(在某些情况下)也不似如何存储数据。问题的关键所在还是我们如何去访问并处理这些数据——无论它们以何种格式存放、位于何处。正如我们采用的XML并设计.NET数据访问库的原因所在。因此,在执行一个数据存储时我们要考虑哪些问题呢?而哪种数据访问技术又是最合理的呢?问题的答案更多的基于数据的特征,以及我们要以何种方式使用这些数据。例如,高度结构化的数据,如股票列表或客户的信息,适合用关系型数据库如SQL Server、Oracle或桌面系统的MS Access来存储。但是,非结构化的数据,如报表、数据表、电子邮件消息、家谱和其他一些日用信息,则更适合用XML的树状隐喻来存储。

使用数据存储过程

我们已经知道如何使用SQL语句直接从数据源提取数据。而在实际的应用程序中,更好的办法是使用数据仓库中的存储过程来返回所需的数据集。这样可为用户提供一个更好的性能,同时能更好地控制访问许可,而且还有助于在那些好奇的用户面前隐藏数据仓库表的具体内容。

在传统的ADO中,.NET数据访问类能够像处理SQL语句那样轻而易举地处理存储过程。最简单的存储过程只需要我们指定过程的名称,它们就会返回一组无法由ASP代码控制的结果。不过存储过程是可写的,这样它们就可以接受参数。而这就允许由设定参数值和调用过程的ASP代码来控制所返回行集的实际内容。

JSP提供合并数据的方式

HTML本身没有直接在其输出中包含来自其他文件的数据的方式。这很不幸,因为大量的HTML标记对一个典型的web站点中大量的页面都是通用的——公司标志、版权声明、导航、链接和其他特性。除了文本和图像为静态资源,也需要包含动态内容。JSP提供合并这些数据的两种方式:

1、<%@ include%>伪指令,用于在JSP源码被转换成JAVA servlet源码和被编译前将静态文本复制到其中。典型情况下,文本为HTML代码,但它可以是在JSP页面内显示的任意内容。被包含的文件必须是相对的URL文档,即它只包含路径信息,没有协议或服务器信息。因此,只有当前servlet上下文中的资源可以用这种方式被包含。如果文件以”/”开始,它被认为是相对servlet上下文根的绝对路径。否则,文件名被认为是相对于当前JSP页面的。

静态数据初始化

对类而言,初始化的顺序是由变量在类的定义里面的顺序所决定的。变量的定义可能会分散在类定义的各个地方,并且与方法的定义相互交错,但是变量的初始化会先于任何方法,甚至是构造函数的调用。我们把对象的定义分散到各个地方,你可以从程序的输出中看到,变量的reference被初始化了两次:一次是在构造函数调用之前。(这前一个对象被扔掉了,因此会被当作垃圾回收。)这种做法的效率好像不怎么样,但是却能保证进行适当的初始化,如果你还重载了一个不对变量进行初始化的构造函数,而定义变量的时候又没有提供缺省的初始化值,那又会怎样呢?

«123»
最近发表
控制面板
您好,欢迎到访网站!
  [查看权限]
网站分类
搜索
Tags列表
网站收藏
图标汇集
  • 订阅本站的 RSS 2.0 新闻聚合
友情链接

热门搜索: 外链域名 高外链域名 高收录域名

Copyright www.thyst.cn. Some Rights Reserved.