HelloController.groovy 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package hello
  2. import grails.compiler.GrailsCompileStatic
  3. import grails.converters.JSON
  4. import java.util.concurrent.ThreadLocalRandom
  5. import org.hibernate.Session
  6. @GrailsCompileStatic
  7. class HelloController {
  8. def index() {
  9. plaintext()
  10. }
  11. // benchmark specification
  12. // http://www.techempower.com/benchmarks/#section=code
  13. // Test type 1: JSON serialization
  14. def json() {
  15. def msg = [
  16. message: "Hello, World!"
  17. ]
  18. render msg as JSON
  19. }
  20. // Test type 2: Single database query
  21. def db() {
  22. def random = ThreadLocalRandom.current()
  23. def world = World.read(random.nextInt(10000) + 1)
  24. render world as JSON
  25. }
  26. // Test type 3: Multiple database queries
  27. def queries(int queries) {
  28. def worlds = fetchRandomWorlds(queries, false)
  29. render worlds as JSON
  30. }
  31. private List<World> fetchRandomWorlds(int queries, boolean updateAlso) {
  32. if(queries < 1) queries=1
  33. if(queries > 500) queries=500
  34. def random = ThreadLocalRandom.current()
  35. int[] worldIds = new int[queries]
  36. for (int i = 0; i < queries; i++) {
  37. worldIds[i] = (random.nextInt(10000) + 1)
  38. }
  39. List<World> worlds = new ArrayList<World>(queries)
  40. if (updateAlso) {
  41. Arrays.sort(worldIds)
  42. World.withSession { Session session ->
  43. for (int id : worldIds) {
  44. World world = World.get(id)
  45. world.randomNumber = random.nextInt(10000) + 1
  46. worlds.add(world)
  47. // flush changes
  48. session.flush()
  49. session.clear()
  50. }
  51. }
  52. } else {
  53. for (int id : worldIds) {
  54. worlds.add(World.read(id))
  55. }
  56. }
  57. return worlds
  58. }
  59. // Test type 4: Fortunes
  60. def fortunes() {
  61. def fortunes = Fortune.getAll()
  62. fortunes << new Fortune(id: 0, message: 'Additional fortune added at request time.')
  63. fortunes.sort(true){Fortune it -> it.message}
  64. [fortunes: fortunes]
  65. }
  66. // Test type 5: Database updates
  67. def updates(int queries) {
  68. def worlds = updateWorlds(queries)
  69. render worlds as JSON
  70. }
  71. private List updateWorlds(int queries) {
  72. fetchRandomWorlds(queries, true)
  73. }
  74. // Test type 6: Plaintext
  75. def plaintext() {
  76. render text:'Hello, World!', contentType:'text/plain'
  77. }
  78. }