Pascalsches Dreieck in C und Java (Performance)

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
ctwx
Beiträge: 321
Registriert: 04.04.2010 23:06:55
Lizenz eigener Beiträge: MIT Lizenz

Re: Pascalsches Dreieck in C und Java (Performance)

Beitrag von ctwx » 19.11.2013 06:49:23

king-crash hat geschrieben:Hier ein Vorschlag: NoPaste-Eintrag37463

Um Festplattenoperationen zu vermeiden einfach das fwrite auskommentieren.
Compiler-Optimierungen bringen nicht allzu viel, da die Hauptarbeit bei der libgmp liegt...
Ich musste den Quellcode erst einmal durchsehen (ich verstehe den Code lieber, als ihn stumpf zu kopieren und auszuführen) und muss sagen, dass deine Änderungen echt gut sind. An einen Textbuffer hatte ich auch schon gedacht, aber bisher nicht die Zeit gehabt ihn umzusetzen. Ein bischen Unsicherheit, noch mehr Lecks ins Programm zu packen hatte ich aber auch. ^^

Naja. Deine Lösung braucht bei mir exakt 10 Sekunden. Leider habe ich gerade den Überblick verloren. Ich muss die einzelnen Werte wie lange sie bei mir auf der CPU brauchen mal notieren.


Vielen Dank! :)

wanne
Moderator
Beiträge: 7462
Registriert: 24.05.2010 12:39:42

Re: Pascalsches Dreieck in C und Java (Performance)

Beitrag von wanne » 19.11.2013 08:22:57

ctwx hat geschrieben:An einen Textbuffer hatte ich auch schon gedacht
Eigentlich sollten die f* Funktionen selber buffern.
rot: Moderator wanne spricht, default: User wanne spricht.

wanne
Moderator
Beiträge: 7462
Registriert: 24.05.2010 12:39:42

Re: Pascalsches Dreieck in C und Java (Performance)

Beitrag von wanne » 19.11.2013 10:41:55

Hier mal erste Stats.

Code: Alles auswählen

$ lscpu 
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                2
On-line CPU(s) list:   0,1
Thread(s) per core:    1
Core(s) per socket:    2
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 23
Stepping:              10
CPU MHz:               2401.000
BogoMIPS:              4788.04
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              3072K
NUMA node0 CPU(s):     0,1
ftp://wanne.t-8ch.de/stuff/ergstats.ods

Die orginalversionen bleiben am schnellsten. (Hat aber auch keine vernünftige Fehlerbehandlung wie die letzte.)
Die c++-Version ist die langsamste und ist in den ersten 3 Zeilen falsch.
rot: Moderator wanne spricht, default: User wanne spricht.

Benutzeravatar
king-crash
Beiträge: 722
Registriert: 08.08.2006 12:07:56
Lizenz eigener Beiträge: MIT Lizenz

Re: Pascalsches Dreieck in C und Java (Performance)

Beitrag von king-crash » 19.11.2013 11:10:48

Die Ausgabe als String ist der limiterende Faktor. Wenn du in meinem Code die append Funktionen auskommentierst braucht das ganze bei mir nur noch 100ms.
Eigentlich auch logisch wenn man bedenkt, dass die Ausgabedatei ~500MB groß ist.

Großen Respekt an die GMP Jungs, ihre lib ist wirklich schnell und trotzdem einfach zu bedienen.

Benutzeravatar
king-crash
Beiträge: 722
Registriert: 08.08.2006 12:07:56
Lizenz eigener Beiträge: MIT Lizenz

Re: Pascalsches Dreieck in C und Java (Performance)

Beitrag von king-crash » 19.11.2013 11:35:14

Noch ein kleiner Nachtrag, mein Code hat noch 2 kleine Fehler. Zum Einen sollte das Speicherinkrement nicht 10 sein, das war zu Debug-Zwecken, und zum Anderen muss nicht immer die Ganze Reihe der Zahlen nach rechts weg durchlaufen werden, sondern nur n+3.

Code: Alles auswählen

@@ -81,8 +81,8 @@
 		}
 
 //Huge Pagesize
-//	buffer_increment = 2097152;
-	buffer_increment = 10;
+	buffer_increment = 2097152;
+//	buffer_increment = 10;
 	textlen = 0;
 	buflen = 0;
 	textbuffer_prepare(buffer_increment);
@@ -154,7 +154,7 @@
 
 	for(line=0;line<runs-1;line++)
 		{
-		for(pos=1;pos<fields-1;pos++)
+		for(pos=1;pos<line+4;pos++)
 			{
 			mpz_add(b[pos], a[pos-1], a[pos]);
 			}

Antworten