Performance website download

Empire Phoenix

Top Contributor
Mein Problem ist, das ich eine Website einfach als Quellcode downloaden will, das funktioniert auch soweit, jedoch arg ineffizient wie ich festgestellt habe mit JVisualVm. (Ich brauche über 50s während ich die selbe Site mit Opera in unter 10 geöffnet bekomme)

Meine Methode sieht wie folgt aus:

Java:
	private void download() throws IOException {
		URL weburl = new URL(sitestring);
		Scanner in = new Scanner(weburl.openStream());
		while(in.hasNextLine()){
			sitecode = sitecode + in.nextLine() + "\n";
		}
		in.close();
	}

Jetzt ist die Frage, welche sinnvollen Lösungen die hoffentlich etwas performanter sind habt ihr als Vorschläge?
 
der scanner ist ein kleiner parser, wohingegen der input stream byteweise daten überträgt, ohne deren bedeutung zu kennen. und parsen kostet zeit.

allerdings würde mich auch mal interessieren, wie groß der unterschied ist, also poste es ruhig mal, wenn du es hast 🙂
 
Bah, so langsam bin ich echt am aufgeben, weil ich echte probleme habe das ganze sinnvoll zu machen, oder beispiel zu finden die den ganzen Mist hinterher als String umwandeln, weil ich mit nem Bytearray und sowas absolut nichts anfangen kann :/
 
Wie siehts hiermit aus?

Java:
	BufferedReader reader = new BufferedReader(new InputStreamReader(
		new URL("http://YOURURL").openStream())); //YOURURL ersetzen
	String line;
	while((line=reader.readLine())!=null){
	    System.out.println(line);
	}
 
Hm funktioniert zumindest problem schonmal, mehr als meine versuche, aber zeiterparniss wenn man davon überhaupt im rahmen der ungenauigkeiten im web reden kann ist weniger als 10%
 
Darf man fragen um welche Seite es sich handelt und was du mit dem Input machst? Ich meine du redest hier von mehreren Sekunden ?! Normal braucht man ja nicht mal eine :> Vllt. liegt das Problem ja auch garnicht beim Lesen, sondern am Bearbeiten?
 
Also wenn du dir den String tatsächlich so zusammenbastelst:
Java:
 sitecode = sitecode + in.nextLine() + "\n";

ist es kein Wunder, ich hoffe das war nur ein Beispielcode? Wenn nicht, haben wir den Übeltäter. Benutz einen StringBuilder !

Java:
	BufferedReader reader = new BufferedReader(new InputStreamReader(
		new URL("http://www.kitco.com/").openStream())); // YOURURL
	// ersetzen
	StringBuilder builder = new StringBuilder();
	String line;
	while ((line = reader.readLine()) != null) {
	    builder.append(line).append(System.getProperty("line.separator"));
	}
	System.out.println(builder);
	reader.close();
 
Zuletzt bearbeitet:
erm ... tue ich ^^, gleich mal mit StringBuilder testen
*zeit vergeht*
joa das war das verbrechen ^^ jetzt ist mal eben die 10 er sekunden stelle verschwunden XD
-> 90% ersparniss..

gut das du nie mein bastelprojekt netzwerkcode gesehen hast ^^
das versendet nen String binär und baut den dann zeichen für zeichen so zusammen ... 😵

Bleibt die Frage, wieso ist ein Stringbuilder soviel schneller?
 
Jedes mal wenn du den + Operator bei Strings benutzt, bedeutet das, dass du neue String-Objekte erstellst, weil Strings unveränderbar sind.
 
Richtig.Aber wenn du einen String mit + oder der concat-Methode konkatenierst, wird ein neuer String(char-Array) erstellt und zurückgegeben. Der StringBuffer/builder macht das glaub ich etwas eleganter, indem er sich schon zu Beginn ein größeres char-Array erstellt und wenn dieses dann über die Größe hinaus wächst, wird erst ein neues char-Array erstellt.

String.concat()
Java:
    public String concat(String str) {
	int otherLen = str.length();
	if (otherLen == 0) {
	    return this;
	}
	char buf[] = new char[count + otherLen];
	getChars(0, count, buf, 0);
	str.getChars(0, otherLen, buf, count);
	return new String(0, count + otherLen, buf);
    }
 

Zurück
Oben