简单的播放/缩放基准,可将视图与原始文本输出进行比较

时间:2018-12-30 16:55:00

标签: scala playframework

我只是对一个新的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

@()

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

/app/views/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 个答案:

答案 0 :(得分:1)

正如我在评论中已经说过的那样,该视图并不是微不足道的功能。它执行字符串连接,并且也调用routes.Assets.versioned 3次。分析会话表明,视图基本上只等待此功能:

enter image description here

深入了解versioned函数总是从类路径重新读取文件:

enter image description here

也许您可以提出一个问题并询问Play框架的创建者,是否可以更好地优化资产的服务?

编辑:我介绍了两个设置。首先,我修改了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个请求。结果是一样的。