原贴地址:http://blog.csdn.net/sfeig/archive/2005/08/25/464846.aspx
原贴标题: 一个不起眼的问题导致性能的严重的下降
<img src="" > [[src="" ]]致性能的严重的下降
从昨天下午到今天一直在查找一个很重要的问题,原因是从objectDataSource控件的数据缓存失效查起,导致了站点的性能下降,没想到花了一天的工夫最后查出的原因让人跌破眼镜。
有经验的美工喜欢用<img src="" width="1" height="3">这种方式来精确的控制换行的高度,因为这样可以通过控制<img>的height来实现像素级的换行高度控制,然而这样做对服务器来说却是一个不折不扣的考验和折磨。
当用户请求访问某个页面时,浏览器将首先获取该页面的源代码,然后执行,在执行的过程中,将会在内存中创建该页面对象实例,加载各种资源,激发各种相应的客户端事件,执行对应的javaScript脚本,直到最后展现给我们一个精美的页面。
如果将图片的src设为空,浏览器会将该图片的链接地址设定为站点的地址,如:http://localhost/myWebsites,这一点我们可以通过右键单击图片属性查看url地址得到证实,这时候,浏览器将会按照此地址向服务器请求该图片的实际内容字节流,以便显示该图片,可是按照此地址向服务器请求时,将会执行站点的默认主页面,就像我们请求访问了该主页面一样,服务器将会执行主页面的所有生命周期内的相关代码,然后返回客户端该主页面的生成字节流,由于该图片字节流实际上是一个页面的源代码,所以浏览器将不能正确的显示该图片。
到这里我们也看得很清楚了,当用户请求访问含有<img src="">页面时,将会导致了服务器额外的执行站点主页面,相当于我们同时访问了当前页面和站点主页面两个页面。服务器会将这两个页面内容字节流返回客户端,不但浪费了服务器的资源,还白白消耗了宝贵的网络带宽。如果您的系统是多层架构的话,同样将会影响到每一层服务器的性能。
为了验证这里的结论,我们不妨做两个页面:
Page1.htm
<html>
<body>
this is the default page.
</body>
</html>
Page2.htm
<html>
<body>
<img src="" width=500 height=100><br>
this is the user requested page.
</body>
</html>
在IIS中将page1.htm设为主页面,分两次访问page2.htm:
第一次:访问page2.htm页面,并将该页面保存。
第二次:删除page2.htm页面代码中的<img src="" width=500 height=100>,保存该页面代码,然后再访问此页面,并保存该页面;
结论验证:
服务器端验证:
这一点我们可以通过查看IIS服务日志来确认,默认的IIS日志地址为:C:/WINDOWS/system32/LogFiles/w3svc1,打开该文件夹,可以看到以日期命名的文本文件,格式如:ex050825.log,打开该文件可以看到我们刚才的访问请求记录,如下: #Date: 2005-08-25 01:47:14
#Fields: date time s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) sc-status sc-substatus sc-win32-status
2005-08-25 01:47:14 127.0.0.1 GET /MasterPageAndDefaultRelationStudy/page2.htm - 80 - 127.0.0.1 Mozilla/4.0+(compatible;+MSIE+6.0;+Windows+NT+5.2;+Maxthon;+.NET+CLR+1.1.4322;+.NET+CLR+2.0.50215;+.NET+CLR+1.0.3705) 200 0 0
2005-08-25 01:47:14 127.0.0.1 GET /MasterPageAndDefaultRelationStudy/page1.htm - 80 - 127.0.0.1 Mozilla/4.0+(compatible;+MSIE+6.0;+Windows+NT+5.2;+Maxthon;+.NET+CLR+1.1.4322;+.NET+CLR+2.0.50215;+.NET+CLR+1.0.3705) 200 0 0
2005-08-25 01:47:22 127.0.0.1 GET /MasterPageAndDefaultRelationStudy/page2.htm - 80 - 127.0.0.1 Mozilla/4.0+(compatible;+MSIE+6.0;+Windows+NT+5.2;+Maxthon;+.NET+CLR+1.1.4322;+.NET+CLR+2.0.50215;+.NET+CLR+1.0.3705) 304 0 0
很明显,我们在第一次访问page2.htm页面时,IIS同时向客户端还返回了站点的默认主页面,page1.htm,然而在我们第二次访问page2.htm页面时,服务器并没有返回page1.htm页面。
客户端验证:
浏览到我们刚才分别两次保存页面的地方看看,对于第一次保存的页面,同时还生成了一个同名的文件夹,里面存放的就是以站点名称命名的*.htm页面,其实就是刚才的page1.htm页面;而对于我们第二次保存的页面,并没有生成同名的文件夹。
上面的只是一个示例性质的验证,我们可以写一个更复杂的含有执行代码的验证实例,同时可以启动断点调试功能,这样就能看得更清楚了。
所以最后的结论是:在我们的页面中千万不能含有<img src="">这样的代码,这同样也包括客户端的javascript脚本的动作行为,如创建一个img元素,而将其src设为空等。