8

什么更快?热链接(内联链接)绝对 URI或自己托管资源并使用相对 URI

在他关于如何在 Internet Explorer 中设置 HTML5 元素样式的教程中,Remy Sharp 指出热链接会导致“额外的 HTTP [GET] 请求”。如果您将热链接与将脚本复制和粘贴(嵌入)到 HTML 中进行比较,我同意。但是,如果您将热链接与在本地托管脚本并通过相对路径进行链接进行比较,那么我认为热链接实际上(稍微)更快,因为浏览器不必解析绝对路径来自相对路径的 URL。然而,在这两种情况下,都会执行额外的 HTTP GET 请求,对吗?

4

5 回答 5

11

正确的答案是 - 这取决于。

盗链可能很慢,因为 -

  1. 需要额外的 DNS 查找
  2. 无法重用现有的 TCP/IP 套接字连接

在您的服务器上托管可能会很慢,因为 -

  1. 浏览器只允许每个主机 n 个并发请求。对同一个主机多一个请求可能会引入排队,这可能会很慢。数字“n”是特定于浏览器的,介于 2 和 6 之间。请参阅 browserscope > network > connections per host name

如果您假设两台服务器在各个方面都相同,我会说在您的服务器上托管会更快。在每台主机的连接数为 6 的新浏览器上尤其如此。

但可悲的是,事情从未如此简单。我建议仅在以下情况下使用盗链 -

  1. 您的域上有太多资源(图像/js)
  2. 另一台服务器是 CDN,该资源非常受欢迎,因此很有可能它会出现在浏览器的缓存中。想想谷歌服务器上的 JQuery。

对于所有其他用例,您最好在自己的服务器上托管。

于 2011-03-01T18:43:37.510 回答
2

这更多地与诸如 tcp 之类的较低级别的东西有关,而不是与 http 本身有关。如果你现在从同一个网络服务器获得两个项目,你的浏览器很可能会通过同一个 tcp 连接来获取它们。这是一个 tcp 连接上的两个 http 事务。这避免了建立另一个 tcp 连接的开销。这种开销在流量方面很小,但可能涉及很多延迟。

OTOH,进行两个 http 事务,它们各自去不同的服务器可能更快,也可能不是。没错,您有两个 tcp 连接的开销。在这种情况下,它们序列化的——一个必须在第二个开始之前完成。但是,如果您要拉下许多对象,那么第二、第三、第四……连接都可以并行进行,从而掩盖了延迟问题。在这种情况下,事情可能会快很多,因为小对象可能不受 ISP 的带宽限制。

水确实浑浊。

只需注意延迟和带宽。真正取决于您的资源的数量和大小。

于 2011-03-01T18:27:16.727 回答
2

客户端解析相对 URI 所需的时间绝对可以忽略不计。

因此,无论您使用绝对 URI 还是相对 URI 链接到文档同一域中的资源,都没有任何区别。

唯一的区别是资源托管在不同的服务器上时。然后,您需要与该服务器建立额外的 TCP 连接,而对您已经连接的服务器的额外 HTTP 请求可以使用该连接。

于 2011-03-01T18:46:43.877 回答
0

我想影响这种情况的唯一因素是相关服务器的相对速度(对于速度)以及您是否希望此代码在任何其他站点上运行(为了可维护性)。

于 2011-03-01T18:08:44.560 回答
0

假设资源没有嵌入 HTML 文档本身(即它是链接的),并且资源位于具有相同主机名的同一台服务器上,那么通过绝对或相对 URI 检索资源的时间应该几乎相同。无论哪种方式,都会提交一个额外的 HTTP 请求。如果您想拆分“几乎相同”,我会倾向于相对路径要快得多,因为需要解析的 HTML 数量较少,路径解析(如您所提到的)可能是更快(由于字符串标记器不必处理地址的域部分/地址更短)。出于好奇,这里的区别只是现实的。我无法想象一个网站被优化到这个级别(尽管,它可以建立一个好的经验法则吗?相对路径允许您自由更改站点的域/路径,而无需重写其中包含的所有 URI。)

需要考虑的一件事是,如果资源托管在同一台服务器上,并且引用 HTML 文档的服务器启用了 KeepAlive,则必须初始化另一个 TCP 连接以连接到第二台服务器(以及 DNS 查询用于解析其他服务器的主机名,假设访问不是通过 IP 地址),与同一服务器上的多个引用资源相比会产生额外的开销(GET 请求将在现有 TCP 连接中发出)。

这同样适用于未启用 KeepAlive 的服务器;将为每个请求的资源初始化一个 TCP 连接。

于 2011-03-01T18:21:50.673 回答