Почему указание Xss в Maven Surefire заставляет ScalaTest работать в два раза быстрее? - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть один FunSuite из модульных тестов, тестирующих высокорекурсивную (не хвостовую) функцию Scala.Если я добавлю строку ниже в мой pom.xml Surefire <configuration>, он будет работать в два раза быстрее.

<argLine>-Xss1024k</argLine>

Не важно, какое значение я укажу, за исключением того, что если я укажу действительно низкое значение, например-Xss256k Я получаю ожидаемое исключение StackOverflowException.В противном случае я могу установить его в диапазоне от 512 К до 512 м, и время выполнения все равно.Но затем, если я полностью удаляю строку из pom.xml, время выполнения удваивается.

Почему это может быть?

1 Ответ

0 голосов
/ 01 марта 2019

Состояния спецификации JVM,

Поскольку стек виртуальной машины Java никогда не обрабатывается напрямую, за исключением кадров push и pop, кадры могут выделяться кучей.Память для стека виртуальных машин Java не обязательно должна быть смежной.

Эта спецификация позволяет стекам виртуальной машины Java иметь фиксированный размер или динамически расширяться и сжиматься в соответствии с требованиями вычислений.Если стеки виртуальных машин Java имеют фиксированный размер, размер каждого стека виртуальных машин Java можно выбирать независимо при создании этого стека.

Я думаю, что используемая вами jvm поддерживает динамическое расширение стеков,Когда цепочка вызовов становится больше, чем начальный размер стека по умолчанию, кадры стека будут выделяться из кучи.Это приведет к замедлению выполнения.

И случай Вы задаете размер стека с помощью параметра, возможно, стек работает в режиме фиксированного размера.В этом случае все пространство будет выделено заранее, и никаких новых выделений не потребуется.Также, когда вы задаете низкий размер стека, он не расширяется и выдает StackOverflow, это также показывает, что он работает в режиме фиксированного размера.

Поскольку вы не упомянули реализацию JVM, которую вы используете, это только мое предположениена основе информации из спецификаций JVM и вашего варианта использования.

https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.5.2

...