我想测试GraphQL endpoint
和RESTful endpoint
的响应时间,因为我以前从未使用过GraphQL,因此我将在下一个Laravel项目中使用它。
因此,我正在使用Lighthouse PHP软件包通过Laravel应用提供GraphQL终结点,并且我还创建了一个RESTful终结点。
两个端点(GraphQL和RESTful)都旨在从我的本地数据库中获取所有用户(250个用户)。
因此,基于测试,我在这里注意到的是,当我在Postman
上测试这两个端点时,RESTful端点响应比GraphQL端点更快。
我能知道为什么在两个端点都获取相同数据时GraphQL端点的响应比RESTful需要更多的时间吗?
答案 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 毫秒