【发布时间】:2012-06-13 08:33:45
【问题描述】:
我想知道哪种方法更好, 多个 HTTP 请求要请求多个小文件 要么 一次请求一个大文件
请提供两种方法的优缺点,因为我在网上得到了相互矛盾的搜索结果。
【问题讨论】:
-
您确实应该为您的问题提供更多背景信息。您已标记此“ASP.NET”,但不清楚您实际请求的是哪种数据:我们是在谈论网页,还是数 GB 的文件下载?
标签: c# asp.net performance http web
我想知道哪种方法更好, 多个 HTTP 请求要请求多个小文件 要么 一次请求一个大文件
请提供两种方法的优缺点,因为我在网上得到了相互矛盾的搜索结果。
【问题讨论】:
标签: c# asp.net performance http web
Yahoo 页面上的提示之一是最小化 HTTP 请求
http://developer.yahoo.com/performance/rules.html#num_http
主要原因是我们在每个请求中都有一个额外的开销。正如雅虎所说:
80% 的最终用户响应时间花费在前端。大多数 这次被捆绑在下载页面中的所有组件: 图像、样式表、脚本、Flash 等。 组件反过来减少了所需的 HTTP 请求数量 渲染页面。这是加快页面速度的关键。
在每个 ASP.Net 调用中,我们还拥有整个页面请求的会话锁定。这意味着所有用户的所有请求都必须相互等待,因为会话将锁定页面的其余部分,直到当前页面完成。
即使这听起来很糟糕,它对初创网站和小型网站都有很大帮助,因为它对同步所有数据有很大帮助,而不仅仅是会话。
因此,通过多次调用,您可以获得一系列数据,而不是并行获取数据。
参考:jQuery Ajax calls to web service seem to be synchronous
Replacing ASP.Net's session entirely
对于每个请求,您还拥有从浏览器到服务器的 cookie。因此,如果您的 cookie 接近 500 字节并且您进行了 100 次调用,那么您有额外的 50KB 数据需要移动。这可以使用无 cookie 的域来解决,但如果您没有此选项,那么接下来就是尝试减少调用次数。
参考:http://developer.yahoo.com/performance/rules.html#cookie_free
如果您有许多图像要下载并显示在浏览器上,针对一个包含精灵或其他图像的文件图像,浏览器可以减少渲染时间,因为浏览器会重新渲染每个图像的每个部分.但是如果图片来自一个 sprite 文件,那么浏览器只需要一个动作来渲染它们 - 所以浏览器拥有更少的文件会更快。
这里也是一样。一旦您将所有 javascript 合并到一个或两个文件中,浏览器就可以一次获取并解析它们。如果您拥有尽可能多的文件,则浏览器需要逐一解析它们。此外,如果你 gzip 压缩 javascript 文件,它会比拥有许多小文件要好得多。
对我来说,当这些数据可以与用户交互时,您可以使用 ajax 请求更多数据。这可能是请求额外数据库调用和计算的信息,您可以在第一次请求时避免这些信息,并且可能用户实际上从未要求过它们。
您可以通过这种方式拆分请求,仅在用户请求时获取额外数据,如果您这样做,您将减少数据库调用。
例如,在亚马逊的页面上,轮播控件仅在您在轮播中请求更多商品时才加载额外商品,或者仅在您向下浏览页面时显示用户历史记录。
【讨论】:
我不知道整个情况,不知道你如何定义“大文件”,但我的头顶:
一个大文件
几个较小的文件
【讨论】:
与往常一样,当有人问一个没有上下文的开放式问题时,“这取决于。”
如果您一次通过网络发送大量数据,将其拆分为更小的数据块只会增加开销。压缩通常更适用于较大的数据,每个请求的开销并非微不足道,而且创建和维护到服务器的单个数据流也有好处。
但是,由于您已标记此 ASP.NET,因此可以合理地假设您在谈论典型的网页数据。这些数据通常被分成单独的文件,通常是通过使用:样式表、脚本、页面内容、图像等。
这样做有方便的原因:作为开发人员,处理只有一种内容类型的文件会更容易。从技术上讲,您可以将所有图像文件作为二进制数据嵌入到 HTML 文件的标记中,但这使得编辑图像变得非常困难!
在性能方面,较小的文件确实会稍微减慢初始传输速度,但通常会受益的是后续传输的速度。大多数客户端浏览器会缓存单个文件,并且不会重复下载这些文件。通过将内容分成更小的文件并在多个页面中重复使用这些文件,我们减少了跨多个请求下载特定数据片段的次数。通过这种方式,您可以通过将可重复使用的内容分成更小的文件来提高整个网站的性能。
【讨论】: