Die Beschwerde war ja auch nicht ganz ernst gemeintXin hat geschrieben: Sorry, war canlot.

Die Beschwerde war ja auch nicht ganz ernst gemeintXin hat geschrieben: Sorry, war canlot.
O.odani93 hat geschrieben:Ich finde die Diskussion hier sehr interessant und habe eine NASM-Version ins Rennen geschickt
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
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
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;
}
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.
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.
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ß...).
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.
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?
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.
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.
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.
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ß...).