Seite 1 von 1
Garbage Collector ausschalten
Verfasst: Sonntag 22. Februar 2015, 18:10
von Butterblum
Hallo zusammen,
ich hätte eine Frage und vieleicht kann mir ja jemand von euch helfen. Ich habe in einem Python Buch gelesen, dass man, um bei einer Laufzeitmessung mit timeit unverfälschtere Ergebnisse zu bekommen, den Garbage Collector ausschalten könne. Leider steht da nicht wie.
Hat da jemand eine Ahnung wie das geht? In den Eclipse Einstellungen meines Py Interpreters habe ich leider nix dazu gefunden.
Vielen Dank schonmal
Re: Garbage Collector ausschalten
Verfasst: Sonntag 22. Februar 2015, 18:18
von BlackJack
@Butterblum: Ich verstehe die Logik dahinter nicht. Man will doch messen wie schnell etwas im realen Einsatz ist und da ist die Speicherbereinigung ja aktiv. Was nützen einem Laufzeiten bei denen ein Teil der Arbeit nicht gemacht wird?
Ansonsten hilft ein Blick in das Inhaltsverzeichnis der Standardbibliothek und der Suche nach dem Wort „garbage collection” in dem Inhaltsverzeichnis um zur Dokumentation des `gc`-Moduls zu gelangen.
Re: Garbage Collector ausschalten
Verfasst: Montag 23. Februar 2015, 10:42
von Butterblum
Der Grund warum ich ihn ausschalten will ist der, dass ich versuche möglichst gleichbleibende Bedinnungen zu bekommen. Ich vergleiche verschiedene Datenstrukturen in dem ich sie mit Daten fülle und sie wieder lösche und dabei die Zeit messe. Wenn der GC bei Messung 1
Schwerstarbeit leistet und bei Messung 2 gar nicht dann "verfälscht" das ein wenig das Ergebnis, da ich allgemeinere und plattformunabhängigere AUssagen treffen will
Aber Danke für den Tip. Ich schau es mir mal an
Re: Garbage Collector ausschalten
Verfasst: Montag 23. Februar 2015, 10:46
von Hyperion
Butterblum hat geschrieben:Ich vergleiche verschiedene Datenstrukturen in dem ich sie mit Daten fülle und sie wieder lösche und dabei die Zeit messe.
Wie löschst Du sie denn oder was bedeutet für Dich "löschen"?
Re: Garbage Collector ausschalten
Verfasst: Montag 23. Februar 2015, 10:52
von darktrym
Gleichbleibende Bedingungen wirst du schon nicht wegen dem Betriebssystem gewährleisten können. Normalerweise mittelt man seine Ergebnisse oder nimmt den Median dafür.
Re: Garbage Collector ausschalten
Verfasst: Montag 23. Februar 2015, 10:55
von EyDu
Wenn der Garbage Collector aus ist stellt sich dann allerdings die Frage, was du überhaupt noch misst. Denn mit der Realität hat die ganze Sache dann nichts mehr zu tun. Letztendlich optimierst du dann nur darauf, dass die Kosten währen der Berechnung gering sind, am Ende prinzipiell aber in ungeahnte Höhen steigen. Das Aufräumen gehört bei Python eben mit zur Berechnung dazu.
Damit dir der GC, andere Prozesse oder der Scheduler deines Betriebssystems nicht deine ganze Messung versauen, solltest du die Messung auch häufiger durchführen und dann mitteln, den Median bestimmen oder das Minimum verwenden. Dann hast du eine halbwegs zuverlässige Aussage.
Re: Garbage Collector ausschalten
Verfasst: Montag 23. Februar 2015, 11:56
von Butterblum
Hyperion hat geschrieben:Wie löschst Du sie denn oder was bedeutet für Dich "löschen"?
Löschen heisst, ich trenne den Verweis bzw. den Link zu einem Element. Ohne GC ist das Element nicht wirklich gelöscht, das ist schon klar. Aber ich will wie gesagt allgemeinere Aussagen treffen.
darktrym hat geschrieben:Damit dir der GC, andere Prozesse oder der Scheduler deines Betriebssystems nicht deine ganze Messung versauen, solltest du die Messung auch häufiger durchführen und dann mitteln, den Median bestimmen oder das Minimum verwenden. Dann hast du eine halbwegs zuverlässige Aussage.
Das mach ich auch, ich messe mehere (hundert) mal und ermittle dann den besten Wert
Die Idee habe ich aus einem Python Buch von Gallileo Computing
http://www5.in.tum.de/~/ferstlc/python_ ... 5bd840b9c7
Erste Hinweisbox
Re: Garbage Collector ausschalten
Verfasst: Montag 23. Februar 2015, 12:05
von nezzcarth
Butterblum hat geschrieben:Hallo zusammen,
Ich habe in einem Python Buch gelesen, dass man, um bei einer Laufzeitmessung mit timeit unverfälschtere Ergebnisse zu bekommen, den Garbage Collector ausschalten könne. Leider steht da nicht wie.
Ich verstehe die Passage, die du verlinkt hast so, dass timeit das bereits selbst macht (und dich wiederrum so, dass du wissen möchtest, wie man das für timeit ausschaltet).
Ähnlich äußert sich die Doku:
https://docs.python.org/2/library/timeit.html#timeit.Timer.timeit hat geschrieben:
By default, timeit() temporarily turns off garbage collection during the timing. The advantage of this approach is that it makes independent timings more comparable. This disadvantage is that GC may be an important component of the performance of the function being measured. If so, GC can be re-enabled as the first statement in the setup string.
Re: Garbage Collector ausschalten
Verfasst: Montag 23. Februar 2015, 12:12
von BlackJack
@Butterblum: Das Objekt kann auch ohne GC gelöscht werden. Zumindest bei CPython wird der GC nur für Objekte verwendet bei denen eine zyklische Abhängigkeit verhindert das der Referenzzähler des Objekts auf 0 fallen kann.
Ich halte den Hinweis für Unsinn. Weder der Hinweis noch Du haben bisher begründet *warum* man Messergebnisse haben möchte die am Ende nichts mit dem realen Laufzeitverhalten zu tun haben werden. Wenn die Schwankungen in der Laufzeit die durch den GC verursacht werden so gross sind, dass sie Unterschiede in Algorithmen überdecken, dann haben diese Unterschiede schlicht keine praktische Relevanz weil man sie in der Realität gar nicht beobachten kann.
Und auch das abschalten des GCs hat ja Nebenwirkungen. Es kann zum Beispiel dazu kommen dass deutlich mehr Speicher verbraucht wird und damit mehr Cache-Misses entstehen und der Code dadurch langsamer wird.
Re: Garbage Collector ausschalten
Verfasst: Montag 23. Februar 2015, 12:14
von Butterblum
Butterblum hat geschrieben:
Ich verstehe die Passage, die du verlinkt hast so, dass timeit das bereits selbst macht (und dich wiederrum so, dass du wissen möchtest, wie man das für timeit ausschaltet).
Ähnlich äußert sich die Doku:
ah...das hatte ich nicht gerafft, ich dachte ich muss das explizit ausschalten.
Danke für den Hinweis, damit ist mir schon sehr geholfen