与RESTful相比,GraphQL GET响应时间慢

时间:2019-06-28 06:34:04

标签: laravel graphql graphql-php

我想测试GraphQL endpointRESTful endpoint的响应时间,因为我以前从未使用过GraphQL,因此我将在下一个Laravel项目中使用它。

因此,我正在使用Lighthouse PHP软件包通过Laravel应用提供GraphQL终结点,并且我还创建了一个RESTful终结点。

两个端点(GraphQL和RESTful)都旨在从我的本地数据库中获取所有用户(250个用户)。

因此,基于测试,我在这里注意到的是,当我在Postman上测试这两个端点时,RESTful端点响应比GraphQL端点更快。

我能知道为什么在两个端点都获取相同数据时GraphQL端点的响应比RESTful需要更多的时间吗?

GET请求的GraphQL端点结果(响应时间:88ms) enter image description here

POST请求的GraphQL端点结果(响应时间:88ms) enter image description here

RESTful端点结果(响应时间:44ms) enter image description here

4 个答案:

答案 0 :(得分:3)

没有免费的午餐。

GraphQL提供了许多有用的功能,但是这些相同的功能总是会产生一些开销。尽管REST端点可以有效地从某些来源提取数据并将其重新配置回客户端,但即使对于相对较小的数据集,GraphQL也会拥有进行一些额外的处理来解析和验证每个个体字段。更不用说解析和验证请求本身所需的处理。而且,这种开销只会随着返回数据的大小而变得更大。

如果要向GraphQL镜像的REST端点引入其他功能(请求响应验证,对部分响应的支持,对单个响应字段进行别名的能力等),您将看到两者之间的性能差距不断缩小。尽管如此,尽管如此,它仍然还是苹果和橘子的比较,因为GraphQL服务将通过某些动作仅仅是因为spec要做的事情。

答案 1 :(得分:2)

TLDR:您的REST示例既简单又不复杂

在Lighthouse中,它正在创建一个AST用于解析graphql请求和您的模式。然后,它将传递所有指令,依此类推,以找出您要执行的操作。它还必须验证您的查询,以查看是否可以在架构上实际运行它。

取决于您在应用程序中的定义方式,它要经历很多步骤。但是,可以通过多种不同的方法来减少这种情况,对graphql schema can be cached进行解析,可以cache the result,使用deferred fields(可能不会加快本示例的速度)。您可以在文档的performance section中阅读有关此内容的更多信息。

如果您要使用某种REST标准(其中还必须解析数据),则无需指定REST的设置方式。如果添加更多功能,则会有更多代码要运行,从而提高了加载速度。

答案 2 :(得分:0)

从Lighthouse v4开始,我们通过从模式中延迟加载最低要求的字段和类型,显着提高了性能。事实证明,根据架构的大小,性能可以提高3到10倍。

对于这样一个简单的查询,您可能仍然不会击败单个REST端点。 Lighthouse将开始在嵌套多个关系的更重嵌套查询中发挥作用。

答案 3 :(得分:0)

尝试在服务器上启用 opcache。这将我的 gql 响应时间从 200 毫秒减少到 20 毫秒