6

我想测试一个 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) 在此处输入图像描述

4

4 回答 4

7

没有免费的午餐。

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

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

于 2019-06-28T10:30:03.617 回答
5

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

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

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

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

于 2019-06-28T14:29:04.563 回答
4

从 Lighthouse v4 开始,我们通过从模式中延迟加载最少需要的字段和类型来显着提高性能。事实证明,这会带来 3 到 10 倍的性能提升,具体取决于架构的大小。

对于这样一个简单的查询,您可能仍然无法击败单个 REST 端点。Lighthouse 将开始在跨多个关系连接的嵌套更重的查询上大放异彩。

于 2019-07-17T06:16:04.577 回答
0

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

于 2021-03-25T09:39:41.533 回答