http HEAD vs GET性能
我正在设置一个REST Web服务,只需要尽可能快地回答YES或NO。
devise一个HEAD服务似乎是最好的办法,但我想知道如果我真的会获得一些时间,而不是做一个GET请求。
我想我的身体stream不能在我的服务器上打开/closures(约1毫秒?)。 由于要返回的字节数量非常less,因此在传输过程中,我是否可以获得IP包数?
预先感谢您的回应!
编辑:
进一步解释背景:
- 如果它们处于活动状态,我有一组REST服务执行一些进程。
- 我有另一个REST服务,指出所有这些第一个服务的状态。
由于最后一个服务将会被非常大的一组客户(每5ms预期一次)调用,所以我想知道是否使用HEAD方法是一个有价值的优化? 响应主体中返回了大约250个字符。 HEAD方法至less可以获得这些250个字符的传输,但是这是什么影响?
我试图testing两种方法(HEAD和GET)之间的差异,运行1000次调用,但根本没有获得任何收益(<1ms)…
RESTful URI应该代表服务器上的“资源”。 资源通常作为logging存储在数据库或文件系统的文件中。 除非资源很大或者在服务器上检索速度慢,否则使用HEAD
而不是GET
可能会带来可衡量的收益。 这可能是检索元数据没有比检索整个资源更快。
你可以实现这两个选项并对它们进行基准testing,以查看哪个更快,但是不是微观优化,而是专注于devise理想的REST接口。 从长远来看,干净的REST API通常比可能或不可能更快的kludgey API更有价值。 我不鼓励使用HEAD
,只是build议你只有在“正确”devise时才使用它。
如果你真正需要的信息是关于一个资源的元数据,那么这个资源可以在HTTP头文件中很好地表示,或者检查资源是否存在, HEAD
可能会很好地工作。
例如,假设您想检查资源123是否存在。 200
表示“是”, 404
表示“否”:
HEAD /resources/123 HTTP/1.1 [...] HTTP/1.1 404 Not Found [...]
但是,如果您希望从REST服务中“是”或“否”是资源本身的一部分,而不是元数据,则应使用GET
。
在寻找请求者询问的同一个问题时,我发现了这个答复。 我也在http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.htmlfind了这个:;
HEAD方法与GET相同,只是服务器不能在响应中返回消息体。 响应HEAD请求的HTTP头中包含的元信息应该与响应GET请求发送的信息相同。 这个方法可以用来获得有关请求隐含的实体的元信息,而不用传递实体主体本身。 此方法通常用于testing超文本链接的有效性,可访问性和最近的修改。
在我看来,对于请求者问题的正确答案是,它取决于REST协议所代表的内容。 例如,在我的特殊情况下,我的REST协议被用来检索相当大的(如超过10K)的图像。 如果我有大量这样的资源被持续地检查,并且考虑到我使用请求标题,那么根据w3.org的build议,使用HEAD请求是有意义的。
我强烈反对这种做法。
RESTful服务应该尊重HTTP动词的语义。 GET动词是为了检索资源的内容,而HEAD动词不会返回任何内容,例如,可以用来查看资源是否已经改变,知道它的大小或types,检查它是否存在等等。
请记住:早期的优化是万恶之源。
使用HEAD请求而不是GET请求,性能几乎不会改变。
此外,当你想要它是REST-ful,你想获得数据,你应该使用GET请求,而不是一个HEAD请求。
我不明白你对“身体stream动开放/closures”的关注。 响应主体将在http响应头部的同一个stream上,并且不会创build第二个连接(顺便说一句,它的范围是3-6ms)。
这似乎是一个非常成熟的优化尝试,只是不会产生显着或甚至可衡量的差异。 真正的区别在于与REST的一致性,build议使用GET来获取数据。
我的答案是否定的,使用GET如果有道理,使用HEAD没有性能增益。
GET取头+本体,HEAD只取头。 哪一个更快,这不应该是个问题。 我不想看到上面的答案。 如果你正在寻找META的信息,而不是为了这个目的去头。
你可以轻松地做一个小testing来衡量自己的performance。 我认为性能的差异是可以忽略的,因为如果你只是在体内返回'Y'或'N',它是一个额外的字节附加到已经打开的stream。
因为它更加正确,所以我也会和GET一起去。 您不应该返回HTTP标头中的内容,而仅返回元数据。