代码之家  ›  专栏  ›  技术社区  ›  Blankman

简单的play/scala基准,呈现视图与原始文本输出比较

  •  0
  • Blankman  · 技术社区  · 6 年前

    我只是在测试一个新的play/scala应用程序。

    当在我的操作中执行简单的文本输出时,我得到 60K 每秒请求数。

    如果我呈现一个视图(见下文),它将下降到 13K 每秒。 因为视图只是scala中的函数,所以我希望调用函数的额外开销不会如此显著地降低每秒的请求量。

    我只为 10-30秒, JVM需要更长的时间来优化,或者这只是预期的行为?

    def index() = Action { implicit request: Request[AnyContent] =>
        Ok("hello")
    }
    

    如果我实际呈现一个视图,每秒请求数将下降到大约 13K .

    def index() = Action { implicit request: Request[AnyContent] =>
        Ok(views.html.index())
    }
    

    /app/views/index.scala.html(应用程序/视图/索引.scala.html)

    @()
    
    @main("Welcome to Play") {
      <h1>Welcome to Play!</h1>
    }
    

    /app/views/main.scala.html(应用程序/视图/main.scala.html)

    @*
     * This template is called from the `index` template. This template
     * handles the rendering of the page header and body tags. It takes
     * two arguments, a `String` for the title of the page and an `Html`
     * object to insert into the body of the page.
     *@
    @(title: String)(content: Html)
    
    <!DOCTYPE html>
    <html lang="en">
        <head>
            @* Here's where we render the page title `String`. *@
            <title>@title</title>
            <link rel="stylesheet" media="screen" href="@routes.Assets.versioned("stylesheets/main.css")">
            <link rel="shortcut icon" type="image/png" href="@routes.Assets.versioned("images/favicon.png")">
    
        </head>
        <body>
            @* And here's where we render the `Html` object containing
             * the page content. *@
            @content
    
          <script src="@routes.Assets.versioned("javascripts/main.js")" type="text/javascript"></script>
        </body>
    </html>
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   ygor    6 年前

    正如我在评论中所说,视图不是一个微不足道的函数。它执行字符串连接并调用 routes.Assets.versioned 三次。分析会话显示,视图基本上只等待此函数:

    enter image description here

    深入研究,我们知道, versioned 函数始终从类路径重新读取文件:

    enter image description here

    也许您可以打开一个问题,询问PlayFramework创建者,资产服务是否可以更好地优化?

    编辑 :我介绍了两种设置。首先我修改了 HomeControllerSpec 测试:

    "render the index page from a new instance of controller" in {
      val controller = new HomeController(stubControllerComponents())
      val indexAction = controller.index()
      val fakeRequest = FakeRequest(GET, "/")
    
      var i = 100000
      while (i > 0) {
        indexAction.apply(fakeRequest)
        i -= 1
      }
    

    但这并不排除某些组件在生产模式下的行为会有所不同。所以我跑了 sbt stage 启动生成的应用程序,将探查器附加到运行JVM上,并对已分析的JVM执行10000个请求。结果是一样的。