| 

.NET C# Java Javascript Exception

Vermutetets Garbage-Collection Problem - bitte um Falsifikation

Dies ist das Archiv des ehemaligen Forums zum Thema Groovy, Grails, Griffon und Bean Scripting Framework, welches unter groovy-forum.de existierte. Die neue Adresse des Groovy-Forums ist: http://codekicker.de/fragen/themen/groovy.


Vermutetets Garbage-Collection Problem - bitte um Falsifikation

wilhelm.nagy@bfw.gv.at - 17.03.2008 09:48
Hallo Liste,

Meine Vermutungen in Bezug auf ein GC Problem nimmt konkrete Formen an:

Folgende Codesequenzen sind gegeben: (Unterschiede blau markiert)

CS1: Mit join
WCT: 62ms

         Zeitmessung su = new Zeitmessung()
         su.start()
         List options = [] 
         param.datasource.each {value->
            String selected = ''
            String title = ''
            if (value[3] != null) {
               title = """title="${value[3]}" """
               }
            try {
               if (value[2]) selected = ' selected="selected" '
               }
            catch (Exception e){
               throw new Exception('selectbox: Umwandlungsfehler bei selected: ('+e.message+') value'+selectedvalue)
               }
            // Filtern auszuschliessender Inhalte
            //
            if (param.exclude == null) {
               options << """<option ${title} ${cssclass} value="${value[0]}"${selected}>${value[1]}</option>"""
               }
            else {
               if (!param.exclude.grep(value[0])) {
                  options << """<option ${title} ${cssclass} value="${value[0]}"${selected}>${value[1]}</option>"""
                  } 
               }
            }
         println su.timestamp("option1")
         tag += options.join("\n")




CS2: mit Stringerweiterung
WCT: 6609ms

         su.start()
         param.datasource.each {value->

            String selected = ''
            String title = ''
            if (value[3] != null) {
               title = """title="${value[3]}" """
               }
            try {
               if (value[2]) selected = ' selected="selected" '
               }
            catch (Exception e){
               throw new Exception('selectbox: Umwandlungsfehler bei selected: ('+e.message+') value'+selectedvalue)
               }
            // Filtern auszuschliessender Inhalte
            //
            if (param.exclude == null) {
               tag += """<option ${title} ${cssclass} value="${value[0]}"${selected}>${value[1]}</option>\n"""
               }
            else {
               if (!param.exclude.grep(value[0])) {
                  tag += """<option ${title} ${cssclass} value="${value[0]}"${selected}>${value[1]}</option>\n"""
                  } 
               }
            }
println su.timestamp("option2")
println "stop"
         }

Das Programm wurde interpretiert (also nicht vorher in .class umgewandelt).
Die beiden Programmteile wurden nicht hintereinander sondern getrennt durchgeführt um eine gegenseitige Beeinflussung auszuschließen.

VERMUTUNG1:
Stringerweiterungen werden 'normalerweise' wie folgt vorgenommen:
Länge von String1 + String2 --> Speicher reservieren, kopieren der beiden Strings in speichern dann Speicher freigeben. Ob das genau so in der JVM gemacht wird bzw. ob groovy es so macht entzieht sich meiner Kenntnis es ist aber eine IMHO nachvollziehbare Annahme.

Wird dieser Vorgang in einer Schleife gemacht, So multipliziert sich der Zeitaufwand.

VERMUTUNG2:
Das Erzeugen der Stringobjekte im Schleifenkopf macht das Problem (es muessen die 'alten' Objekt weggeräumt werden).






Ich habe hier eine Beispiel für die Console hergestellt:
// ---- Classe ----------------------------------------------------
class Zeitmessung {
// ----------------------------------------------------------------
   //
   //
   // Nimmt Zeitmessungen vor
   //
   // .--update--.
   // -- wann----+-wer+-- was -------------------------------------
   // 20.11.2007 | ny | erstellt
   //            |    |
   //            |    |
   //            |    |


   long starttime
   long endtime

   def start = {
      starttime = new Date().getTime()
      }

   def getTime = {
      endtime = new Date().getTime()
      }

   String timestamp(message) {
      long runningTime = new Date().getTime()-starttime
      println(sprintf ('%s: %d ms',message,runningTime))
      return sprintf ('%s: %d ms',message,runningTime)
      }

   }


Zeitmessung su = new Zeitmessung()

String buffer1 = ''
String buffer2 = ''
su.start()
(1..1024).each {
   String xString = "${it.toString()}"
   buffer1 += xString
   }
println su.timestamp('Strings erweitern')

List lstBuffer = []
su.start()
(1..1024).each {
   String xString = "${it.toString()}"
   lstBuffer.add(xString)
   }
buffer2 = lstBuffer.join(null)
println su.timestamp('join')
assert (buffer1 == buffer2) : "Ungleiche Buffer"

Wenn ihr zeit habt, so bitte ich um Überprüfung meiner Überlegungen.
Sollten wir tatsächlich ein Problem einkreisen können, könnten wir gemeinsam eine Meldung an die Entwickler schicken.

\^/ili
(Wilhelm Nagy)


Stelle deine Groovy-Frage jetzt!


Diese Seite zeigt den Thread "Vermutetets Garbage-Collection Problem - bitte um Falsifikation" der ehemaligen Webseite groovy-forum.de, welche durch einen Serverunfall zerstört wurde. codekicker.de hat viele Konversationen über die beliebte Programmiersprache Groovy und zugehörige Frameworks wie das Grails-Framework retten können.

Hast Du eine Frage zum Thema Groovy, Grails oder allgemein Java? Viele ehemalige groovy-forum.de Mitglieder beantworten dir auf codekicker.de deine Frage! Stelle jetzt eine Frage!

Viele weitere Diskussionen zu Grails und Groovy befinden sich auf der Threadübersicht des alten groovy-forum.de.