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

Kaz*_*Kaz 6 laravel graphql graphql-php

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

所以我使用Lighthouse PHP 包从我的 Laravel 应用程序中为 GraphQL 端点提供服务,并且我还创建了一个 RESTful 端点。

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

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

我可以知道为什么 GraphQL 端点的响应比 RESTful 花费更多时间,而两个端点都获得相同的数据吗?

GET 请求的 GraphQL 端点结果(响应时间:88 毫秒) 在此处输入图片说明

POST 请求的 GraphQL 端点结果(响应时间:88 毫秒) 在此处输入图片说明

RESTful 端点结果(响应时间:44ms) 在此处输入图片说明

Dan*_*den 7

天下没有免费的午餐。

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

如果您要向 REST 端点引入其他功能(请求响应验证、支持部分响应、为单个响应字段设置别名的能力等),这些功能镜像了 GraphQL,您将看到两者之间的性能差距缩小。尽管如此,它仍然有点像苹果和橘子的比较,因为 GraphQL 服务会经历某些动作,因为这正是规范所说的。


Oli*_*roe 5

TLDR:您的 REST 示例简单且不那么复杂

在 Lighthouse 中,它正在创建一个AST来解析 graphql 请求和您的模式。然后它通过所有指令等等来弄清楚你想要做什么。它还必须验证您的查询,以查看您是否可以在架构上实际运行它。

根据您在应用程序中定义它的方式,它会经历很多步骤。然而,这可以通过多种不同的方式来减少,可以缓存你的 graphql模式的解析,你可以缓存结果,使用延迟字段(可能不会加速这个例子)。您可以在文档的性能部分阅读更多相关信息。

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