Die Beschwerde war ja auch nicht ganz ernst gemeintXin hat geschrieben: Sorry, war canlot.
WordCount lernen
-
nouseforname
- Beiträge: 236
- Registriert: Do Feb 10, 2011 6:31 pm
Re: WordCount lernen
Re: WordCount lernen
Ich finde die Diskussion hier sehr interessant und habe eine NASM-Version ins Rennen geschickt 
Re: WordCount lernen
O.odani93 hat geschrieben:Ich finde die Diskussion hier sehr interessant und habe eine NASM-Version ins Rennen geschickt
Unwissenheit ist ein Segen
- Xin
- nur zu Besuch hier
- Beiträge: 8862
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: WordCount lernen
Ich sitze gerade an eine Version für gnu-asm... blödes Forum hier... ich dachte, damit noch etwas beeindruckendes reißen zu können. ^^dani93 hat geschrieben:Ich finde die Diskussion hier sehr interessant und habe eine NASM-Version ins Rennen geschickt
Meine Version lief als Assembler-Version gegen 22 Uhr?, als ich das die erste Zeile schrieb. Nur der Aufruf aus C, der gelang mir nicht, läuft aber nun endlich.. ich hasse es, ins Bett zu gehen, wenn ich was nicht geschafft habe. (1:30 Uhr)
Zu Dani: Ich brauche einen anderen Aufruf für nasm: /usr/bin/ld: i386 architecture of input file `wcdani.o' is incompatible with i386:x86-64 output - bin aber zu faul jetzt noch nachzugucken.
Der Schnellste ist bisher lollinger, dafür findet er aber die wenigsten Worte. Da muss er wohl nochmal ran. ^^
canlot habe ich von "int i' auf 'unsigned int i' gesetzt, damit er die 3,6GB durchschreiten kann statt abzuschmieren. Auch aus cloidnerux zweiten Algorithmus habe ich den Vergleich auf '\n' entfernt, um gleiche Bedingungen zu schaffen.
Neue Versionen haben cloidnerux, Mr. Mail (ich verrat jetzt mal, dass es bbl ist, so schlecht sind die Werte ja nicht) und NoUseForName eingereicht. Neu dabei ist lollinger mit dem Code, der hier im Thread steht.
Code: Alles auswählen
xin@trinity:/data/home/xin/Personen/xin$ time ./wc
File geöffnet
Size: -534303076
xin : 598752090 Wörter - Zeit: 16760000
xin++ : 598752090 Wörter - Zeit: 15530000
xinasm: 598752090 Wörter - Zeit: 10120000
cloid : 598752090 Wörter - Zeit: 16290000
cloid2: 598752090 Wörter - Zeit: 17450000
nouse : 598752090 Wörter - Zeit: 19710000
nouse2: 598752090 Wörter - Zeit: 17970000
mail : 598752090 Wörter - Zeit: 21090000
mail2 : 598752090 Wörter - Zeit: 16490000
dirty : 606372480 Wörter - Zeit: 20770000
dirty2: 606372480 Wörter - Zeit: 22400000
lollinger: 9 Wörter - Zeit: 0
canlot: 598752090 Wörter - Zeit: 21580000
real 4m0.912s
user 3m36.166s
sys 0m3.304s
Das scheint ihm die CPU aber nicht allzu übel zu nehmen. Das ganze läuft auf einem Intel i7 860@2.8GHz mit 8GB RAM. Ich hätte trotzdem deutlich mehr Zeitverlust erwartet.
Die Assemblerversion (xinasm) ist erwartungsgemäß schneller als die C-Versionen. Ich habe ja den Faktor 2 geschätzt, aber da komme ich nicht ganz ran.
Ich warte noch Dirty Oerti ab und dani mit seiner Nasm-Version. Kerli hat keine Lust auf ein Duell? ^^
Dann würde ich sagen, veröffentliche ich hier alle Quellen, sofern keiner sich sträubt.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Re: WordCount lernen
Hast Recht, Danke!Dirty Oerti hat geschrieben:Außerdem:
Warum brauchst du einen 2. Parameter für die Funktion?!
"words" wird der Funktion übergeben und dann auf 1 gesetzt, wohl gemerkt aber nur das "words" innerhalb der Funktion wordCount! Das "words" in main wird dadurch NICHT verändert!
Ich habe jetzt das Problem so gelöst, dass jetzt sogar " Ich bin . " möglich ist:Dirty Oerti hat geschrieben:lolliger hat geschrieben:Es können beliebig viele Leerzeichen zwischen den Wörtern sein!
Ändere deinen String zu diesem (kopier ihn einfach von hier) :
" Ich bin."
Und teste, wie viele Wörter gezählt werden.
Code: Alles auswählen
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
unsigned int wordCount( const char *str)
{
unsigned int words;
int i;
words=1;
for ( i=0; str[i]==' ' ;i++ )
{
}
for (; (str[i+1]!='.' && str[i+1]!='!' && str[i+1]!='?') ;i++ )
{
if ( (str[i]==' ') && (str[i+1]!=' ') )
words++;
}
return words;
}
int main( void )
{
char const * str = " Ich bin . ";
unsigned int words;
words = wordCount( str );
printf( "Der String enth\x84lt %d W\x94rter\n", words );
return 0;
}
- cloidnerux
- Moderator
- Beiträge: 3125
- Registriert: Fr Sep 26, 2008 4:37 pm
- Wohnort: Ram (Gibts wirklich)
Re: WordCount lernen
Was soll hier geschehen loliger:
?
Mal ne Frage am Rande, hatte dein Text Worte mit nur 1 Zeichen?
Mich wundert es auch nicht, ich habe gestern Abend auch noch etwas herumgespielt, aber kein gescheites Ergebnis bekommen, außer das ich eine Instabile Änderung gemacht habe, der mit bei 7,6MB Lorem Ipsum einen Geschwindigkeitsvorteil gegenüber meinen alten Algorithmen hatte, aber eben ein großes Problem hat, das zum Glück nicht aufgetreten ist mit meinem Test-Text.
So wie es jetzt aussieht, hat XIN die Vordersten beiden Plätze, dann komme ich und bbl.
Und ein Dirty Oerti, der mehr Wörter zählt als wir.
Macht langsam spaß hier^^
MfG cloidnerux
Code: Alles auswählen
for ( i=0; str[i]==' ' ;i++ )
{
}
Ich hab nix dagegen. Vlt können wir dann gemeinsam einen Algorithmus entwickeln, der an sich schneller ist.Dann würde ich sagen, veröffentliche ich hier alle Quellen, sofern keiner sich sträubt.
Mal ne Frage am Rande, hatte dein Text Worte mit nur 1 Zeichen?
Hast du Optimiert compiliert?Um die Ergebnisse mal deuten zu können: Die Algorithmen liegen alle recht nah beieinander. Die Funktion clock() ist viel zu ungenau, um klare Aussagen abzulesen. So ist xin++ mal schneller, mal langsamer als xin. Dass Cloidnerux mit seiner neuen Version langsamer ist, wundert mich nicht. Er scheint in seiner ersten Version einen Ausdruck gefunden zu haben, der vom Compiler perfekt gefressen wird. An der Zeit sieht man, dass bbl im 2. Versuch ähnliche Zeiten hat und der Code ist nahezu identisch - für die CPU wird er vermutlich auch identisch sein. Trotzdem verbrät bbl im 2. Versuch unnötig massiv Zeit, in dem er die Länge des Strings ermittelt (der ist immerhin 3,6GB groß...).
Das scheint ihm die CPU aber nicht allzu übel zu nehmen. Das ganze läuft auf einem Intel i7 860@2.8GHz mit 8GB RAM. Ich hätte trotzdem deutlich mehr Zeitverlust erwartet.
Die Assemblerversion (xinasm) ist erwartungsgemäß schneller als die C-Versionen. Ich habe ja den Faktor 2 geschätzt, aber da komme ich nicht ganz ran.
Mich wundert es auch nicht, ich habe gestern Abend auch noch etwas herumgespielt, aber kein gescheites Ergebnis bekommen, außer das ich eine Instabile Änderung gemacht habe, der mit bei 7,6MB Lorem Ipsum einen Geschwindigkeitsvorteil gegenüber meinen alten Algorithmen hatte, aber eben ein großes Problem hat, das zum Glück nicht aufgetreten ist mit meinem Test-Text.
So wie es jetzt aussieht, hat XIN die Vordersten beiden Plätze, dann komme ich und bbl.
Und ein Dirty Oerti, der mehr Wörter zählt als wir.
Macht langsam spaß hier^^
MfG cloidnerux
Redundanz macht wiederholen unnötig.
quod erat expectandum
quod erat expectandum
-
nouseforname
- Beiträge: 236
- Registriert: Do Feb 10, 2011 6:31 pm
Re: WordCount lernen
Hab auch nix gegen. Finde es allerdings sehr interessant wie die zeitlichen Unterschiede sind wo doch sicher alle ähnlich arbeiten.
Vorallem interessiert mich aber was man noch optimieren kann, speziell natürlich ich selbst. Oder ob das im prinzip eine Frage des Compilers ist.
Vorallem interessiert mich aber was man noch optimieren kann, speziell natürlich ich selbst. Oder ob das im prinzip eine Frage des Compilers ist.
Re: WordCount lernen
Also ich muss schon sagen dass ich ein wenig überrascht bin noch so weit vorne gelandet zu sein. Vor allem auch, weil ich nur etwas Halbwissen in puncto C hatte und mir vieles erstmal anlesen musste.
BTW, ich hab ebenfalls nix gegen eine Veröffentlichung der Codes..
Mein Hauptgedanke dabei war halt, Dekrement ist ja schneller als Inkrement. An größere Einbußen durch strlen (bei so langen Strings) hab ich dabei irgendwie nicht gedacht..Trotzdem verbrät bbl im 2. Versuch unnötig massiv Zeit, in dem er die Länge des Strings ermittelt (der ist immerhin 3,6GB groß...).
BTW, ich hab ebenfalls nix gegen eine Veröffentlichung der Codes..
Re: WordCount lernen
Wartet auf mich ich will noch meine Pointer Version schicken. 
Unwissenheit ist ein Segen
- Xin
- nur zu Besuch hier
- Beiträge: 8862
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: WordCount lernen
Kann man gerne ausprobieren, aber dafür brauchen wir noch eine eindeutige Methode, um die Performance zu testen. clock() ist nur ein Näherungswert und wenn zur Ausführung des Programms swappen muss, dann bringt das nicht mehr viel.cloidnerux hat geschrieben:Ich hab nix dagegen. Vlt können wir dann gemeinsam einen Algorithmus entwickeln, der an sich schneller ist.
(Ja, ich weiß, dass man den Text auch 10 oder 100mal durchgehen kann, aber aktuell dauert der Test schon 4 Minuten...)
Es ist nur ein Lorem Ipsum... oder besser... tausende..cloidnerux hat geschrieben:Mal ne Frage am Rande, hatte dein Text Worte mit nur 1 Zeichen?
Möglich, den Text habe ich aus wikipedia kopiert, dort gibt es eine eigene Seite dafür, wo nur der Text drauf steht. Bei Bedarf schicke ich Dir aber den Originaltextblock
Nein.cloidnerux hat geschrieben:Hast du Optimiert compiliert?
Du und bbl seid öfter mal schneller als ich. Wie gesagt, ich brauche noch eine exaktere Zeitmessung unter Linux. Ich habe es mit der Kernel-Zeit versucht, aber da findet der Compiler die Deklarationen nicht. ^^cloidnerux hat geschrieben:So wie es jetzt aussieht, hat XIN die Vordersten beiden Plätze, dann komme ich und bbl.
Du und bbl habt quasi identischen Code.
Er hat eine sehr scharfe Beschreibung von dem, was ein Wort ist.cloidnerux hat geschrieben:Und ein Dirty Oerti, der mehr Wörter zählt als wir.
Die Aufgabenstellung war Wörter in einem String zu zählen, die zwischen Leerzeichen sind, es ging nicht um Sätze und auch nicht um Zeilenwechsel. "Dies ist ein\nSatz." sind drei Worte: "Dies", "ist", "ein\nSatz."
Die einzigen Trennsymbole sind Stringanfang, Stringende ('\0') und das Leerzeichen.
Mach Dir nix draus. Mit der Aktion bin ich derzeit ganz vorne (sofern dani nicht nachlegt). Assembler für x86 habe ich zuletzt programmiert, da begannen die Jahreszahlen noch mit einer 1 vorne...bbbl hat geschrieben:Also ich muss schon sagen dass ich ein wenig überrascht bin noch so weit vorne gelandet zu sein. Vor allem auch, weil ich nur etwas Halbwissen in puncto C hatte und mir vieles erstmal anlesen musste.
Obwohl es schon irgendwie bedenklich ist, wenn diejenigen, die keine Ahnung haben ganz vorne sind. *grins*
Inkrement und Dekrement sind gleichschnell (oder ich lerne bald etwas ganz Neues). Was Du meinst ist vermutlich ++i und i++, was bei Integern ebenfalls gleichschnell ist.bbbl hat geschrieben:Mein Hauptgedanke dabei war halt, Dekrement ist ja schneller als Inkrement. An größere Einbußen durch strlen (bei so langen Strings) hab ich dabei irgendwie nicht gedacht..Trotzdem verbrät bbl im 2. Versuch unnötig massiv Zeit, in dem er die Länge des Strings ermittelt (der ist immerhin 3,6GB groß...).
Nur bei Klassen solltest Du nach Möglichkeit ++instance statt instance++ verwenden.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
