代码之家  ›  专栏  ›  技术社区  ›  Kazmi John Boker

与RESTful相比,GraphQL GET请求的响应时间较慢

  •  0
  • Kazmi John Boker  · 技术社区  · 6 年前

    我想测试GraphQL端点和RESTful端点的响应时间,因为我以前从未使用过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

    0 回复  |  直到 6 年前
        1
  •  7
  •   Daniel Rearden    6 年前

    天下没有免费的午餐。

    GraphQL提供了许多有用的特性,但这些特性总是会带来一些开销。尽管REST端点可以有效地从某个源提取数据并将其返回到客户端,即使是对于相对较小的数据集,GraphQL也可以 进行一些额外的处理以解决和验证 每个字段 在回应中。更不用说解析和验证请求本身所需的处理了。这种开销只会随着返回数据的大小而增大。

    如果要向REST端点引入其他功能(请求 响应验证、对部分响应的支持、对单个响应字段进行别名的能力等)镜像GraphQL后,您会看到两者之间的性能差距缩小。尽管如此,这还是有点像苹果和橙子的比较,因为GraphQL服务会经历某些动作,因为这就是 spec 说要做。

        2
  •  5
  •   Oliver Nybroe    6 年前

    TLDR:您的REST示例很简单,也不那么复杂

    在灯塔里,它正在创造一个 AST 用于解析graphql请求和模式。然后,它会传递所有指令,以此类推,以了解您试图做什么。它还必须验证您的查询,看看您是否可以在模式上实际运行它。

    根据您在应用程序中如何定义它,它需要经过很多步骤。然而,这可以通过多种不同的方式来减少,比如对graphql的解析 schema can be cached 你可以 cache the result 使用 deferred fields (可能不会加快这个例子的速度)。你可以在 performance section 医生的名字。

    如果您使用的是某种REST标准,并且REST还必须解析数据,那么您没有指定REST的设置方式。如果您添加了更多的特性,那么将有更多的代码需要运行,因此加载速度会更高。

        3
  •  4
  •   spawnia    6 年前

    从Lighthouse v4开始,我们通过延迟加载模式中最少需要的字段和类型,显著提高了性能。这将带来3到10倍的性能提升,这取决于模式的大小。

    对于这样一个简单的查询,您可能仍然无法击败任何一个REST端点。Lighthouse将开始关注更多跨多个关系连接的嵌套查询。

        4
  •  0
  •   Jens Lindström    4 年前

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

    推荐文章