Forum Programmation.autre Voir les créations d'objets intermédiaires en Scala

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
0
24
sept.
2017

Bonjour,

J'aimerai generer une liste de la forme suivante en Scala:
aa -> 0
ab -> aa + 1
ac -> ab + 1

C'est pour un faire un unit test dans un exercice sur coursera.

Alors j'ai quelque chose et j'ai utilise des Stream au lieu de simples listes dans l'intention d'eviter de creer des listes intermediaires et donc de diminuer la consommation memoire. D'ou ma question:

Est-que quelqu'un connait un outil pour rapidement visualiser les allocations d'objets en scala?

Je pense a JConsole, mais c'est un peu lourd a preparer juste pour tester un bete truc comme ca.

Sinon j'ecoute aussi vos suggestions d'amelioration du code :-)

val alphabet = "abcdefghijklmnopqrstuvwxyz".map(_.toString)

val binomes = for {
  first <- (0 to 25).toStream
  second <- (0 to 25).toStream
} yield {
  alphabet(first) + alphabet(second)
}

binomes.zip(binomes.tail).map {
  case (biAA, biAB) => biAB -> (biAA + " + 1")
}.toMap
  • # Generer un heap dump et lire avec jhat

    Posté par  . Évalué à 2.

    Ce que j'ai essaye c'est de generer fichier qui contient un heap dump la classe HotSpotDiagnosticMXBean puis de le lire avec jhat.

    Je peux alors voir la liste des classes instanciees et le nombre d'instances.

    J'aimerais bien voir l'economie de creation d'objets qu'on obtient avec les stream. Mais si je compare avec et sans Stream (il faut aussi que je regarde du cote des view qui ont l'air plus approprie pour une lecture paresseuse d'une liste), et que j'ajoute des map inutiles, je ne vois aucune difference. Je me demande si le garbage collector ne passe pas avant que mon dump ne soit execute.

    import java.time.ZonedDateTime
    import java.time.format.DateTimeFormatter
    
    import com.sun.management.HotSpotDiagnosticMXBean
    
    object CreateList {
      val HOTSPOT_BEAN_NAME = "com.sun.management:type=HotSpotDiagnostic"
    
      def printDump(fileName: String): Unit = {
        val bean = initDiagnosticBean()
    
        bean.dumpHeap(fileName, true)
      }
    
      def initDiagnosticBean(): HotSpotDiagnosticMXBean = {
        import com.sun.management.HotSpotDiagnosticMXBean
        import java.lang.management.ManagementFactory
        val server = ManagementFactory.getPlatformMBeanServer
        ManagementFactory.newPlatformMXBeanProxy(server, HOTSPOT_BEAN_NAME, classOf[HotSpotDiagnosticMXBean])
      }
    
      def apply(): Unit = {
        val alphabet = ('a' to 'z').map(_.toString)
    
        val binomes = for {
          first <- 0 to 25
          second <- 0 to 25
        } yield {
          alphabet(first) + alphabet(second)
        }
    
        binomes.map(x => x).map(x => x).map(x => x).zip(binomes.tail).map {
          case (biAA, biAB) => biAB -> (biAA + " + 1")
        } takeRight 5 foreach println
    
        val time = formattedTime()
        printDump(s"dump_$time.txt")
      }
    
      def formattedTime(): String = ZonedDateTime.now.format(DateTimeFormatter.ISO_TIME)
    }
    
    object Main extends App {
      CreateList()
    }

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.