{"id":2424,"date":"2013-09-30T14:19:20","date_gmt":"2013-09-30T12:19:20","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=2424"},"modified":"2013-09-30T14:19:20","modified_gmt":"2013-09-30T12:19:20","slug":"thema-der-woche-performant-gedacht","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2013\/09\/thema-der-woche-performant-gedacht\/","title":{"rendered":"Thema der Woche: Performant gedacht?"},"content":{"rendered":"<p>Diskutiere folgende Fragen:<\/p>\n<table cellspacing=\"0\" cellpadding=\"0\" border=\"1\">\n<tbody>\n<tr>\n<td width=\"100%\">\n<p><b>Frage<\/b><\/p>\n<\/td>\n<td>\n<p><b>richtig<\/b><\/p>\n<\/td>\n<td>\n<p><b>falsch<\/b><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td width=\"100%\">\n<p>Native Compiler k\u00f6nnen viel kompakteren Maschinencode erstellen.<\/p>\n<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td width=\"100%\">\n<p>n+n ist schneller als 2*n.<\/p>\n<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td width=\"100%\">\n<p>Anweisungen wie n\/2, n\/4, n*2 sollte man immer durch Verschieben nachbilden.<\/p>\n<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td width=\"100%\">\n<p>F\u00fcr eine <b>switch<\/b>-Anweisung kennt der Compiler zwei unterschiedliche Umsetzungen in Bytecode.<\/p>\n<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td width=\"100%\">\n<p>Schleifen soll man immer runterz\u00e4hlen. Das ist viel schneller.<\/p>\n<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td width=\"100%\">\n<p>\u00dcber Weak-Reference verwaltet Objekte werden fr\u00fcher freigegeben, als \u00fcber Soft-Reference verwaltete Objekte.<\/p>\n<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td width=\"100%\">\n<p>Synchronisierte Methoden sind nicht viel langsamer im Aufruf als nicht-synchronisierte Methoden.<\/p>\n<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td width=\"100%\">\n<p>Wenn man schnellen Zugriff auf ein Attribut haben muss, dann w\u00fcrde man auf die <b>get()<\/b>-Funktion verzichten und das Attribut zum Lesen freigeben. Das ist zwar kein Gutes Design, aber im Zugriff viel schneller.<\/p>\n<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td width=\"100%\">\n<p>Je tiefer die Vererbungshierarchie ist, desto langsamer ist eine Objekterzeugung.<\/p>\n<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td width=\"100%\">\n<p>Statische Eigenschaften sind im Zugriff immer viel schneller als Objekteigenschaften.<\/p>\n<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td width=\"100%\">\n<p>Wenn man intern eine Liste als Datenstruktur benutzt, man m\u00f6chte diese aber sicher nach au\u00dfen weitergeben (etwa durch <b>getListe()<\/b>), dann muss man die Liste immer kopieren.<\/p>\n<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td width=\"100%\">\n<p>Felder beliebiger Gr\u00f6\u00dfe zu kopieren ist mit <b>System.arraycopy()<\/b> immer am schnellsten.<\/p>\n<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td width=\"100%\">\n<p>Ein <b>String<\/b>-Objekt aus einem <b>StringBuffer<\/b> zu erstellen kostet noch einmal Speicher f\u00fcr die gesamte Zeichenkette.<\/p>\n<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td width=\"100%\">\n<p><b>&quot;&quot;+ganzzahl<\/b> ist in nettes Idiom zur Konvertierung von Ganzzahlen in Strings, was auch in der Performance nicht schlecht ist.<\/p>\n<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td width=\"100%\">\n<p><b>intern()<\/b> ist eine n\u00fctzliche Funktion, die mehr Vorteile als Nachteile mit sich bringt.<\/p>\n<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td width=\"100%\">\n<p><b>charAt()<\/b> von <b>String<\/b> ist schneller als <b>charAt()<\/b> von <b>StringBuffer<\/b>.<\/p>\n<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td width=\"100%\">\n<p><b>substring()<\/b> erzeugt ein neues Zeichenfeld-Objekt, das genau den ausgeschnittenen Teil speichert.<\/p>\n<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td width=\"100%\">\n<p>Liest eine Schleife Zeilen aus einer Datei aus, so kann ein <b>StringTokenizer<\/b> gut benutzt werden, um die Zeilen zu untersuchen.<\/p>\n<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td width=\"100%\">\n<p><b>StringBuffer<\/b> ist von der Performance ausgezeichnet.<\/p>\n<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td width=\"100%\">\n<p>Es spielt keine gro\u00dfe Rolle, ob man einer <b>HashMap<\/b> eine Initialgr\u00f6\u00dfe gibt oder nicht.<\/p>\n<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td width=\"100%\">\n<p>Eine Menge von Wahrheitswerten sind in einem <b>boolean<\/b>-Array gut aufgehoben.<\/p>\n<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td width=\"100%\">\n<p>Ein <b>BufferedOutputStream<\/b> um einen beliebigen Stream bringt in jedem Fall einen Geschwindigkeitsvorteil.<\/p>\n<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td width=\"100%\">\n<p>Eine <b>ArrayList<\/b> kann viel kompakter serialisiert werden als eine <strong>LinkedList<\/strong>.<\/p>\n<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td width=\"100%\">\n<p>Mit <b>java.nio<\/b> kann man Dateien viel schneller kopieren als ohne.<\/p>\n<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td width=\"100%\">\n<p>Ein Server sollte eine Anfrage immer mit einem neuen Thread beantworten.<\/p>\n<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td width=\"100%\">\n<p><b>SELECT * FROM Tabelle<\/b> ist unproblematisch.<\/p>\n<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td width=\"100%\">\n<p>Es ist egal, ob ich einen <b>ResultSet<\/b> mit <b>getXXX(String Spaltenname)<\/b> oder <b>getXXX(int Spaltennummer)<\/b> abfrage.<\/p>\n<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td width=\"100%\">\n<p>F\u00fcr mehrere Anfragen an eine Datenbank ist immer ein <b>PreparedStatement<\/b> einzusetzen.<\/p>\n<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td width=\"100%\">\n<p>Eine <b>JTable<\/b> holt sich beim Scrollen jedes Element neu aus dem Model.<\/p>\n<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td width=\"100%\">\n<p>Wenn man SwingWorker durch <a href=\"http:\/\/foxtrot.sourceforge.net\/\">FoxTrot<\/a> ersetzt, gewinnt man noch einmal Geschwindigkeit bei Swing-Programmen.<\/p>\n<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td width=\"100%\">\n<p>Ein Obfuscator f\u00fchrt bei Applets zu einer Minimierung der \u00dcbertragungszeit.<\/p>\n<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n","protected":false},"excerpt":{"rendered":"<p>Diskutiere folgende Fragen: Frage richtig falsch Native Compiler k\u00f6nnen viel kompakteren Maschinencode erstellen. &nbsp; &nbsp; n+n ist schneller als 2*n. &nbsp; &nbsp; Anweisungen wie n\/2, n\/4, n*2 sollte man immer durch Verschieben nachbilden. &nbsp; &nbsp; F\u00fcr eine switch-Anweisung kennt der Compiler zwei unterschiedliche Umsetzungen in Bytecode. &nbsp; &nbsp; Schleifen soll man immer runterz\u00e4hlen. Das ist [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","_links_to":"","_links_to_target":""},"categories":[13],"tags":[],"class_list":["post-2424","post","type-post","status-publish","format-standard","hentry","category-die-wochentliche-dosis-java"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/2424","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/comments?post=2424"}],"version-history":[{"count":1,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/2424\/revisions"}],"predecessor-version":[{"id":2425,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/2424\/revisions\/2425"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=2424"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=2424"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=2424"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}