Was haltet ihr von dieser Ausgabefunktion? (Optimieren Sie Das!)
-
std::ostream & print(std::ostream & out) const { const float *list[5] = {&w,&x,&y,&z,0}; const char *suffixes[5] = {"","i","j","k",0}; const float **element = list; const char **suffix = suffixes; for(;*element; ++element, ++suffix) if(**element) { out << **element << **suffix; break; } if(!*element) out << '0'; else ++element, ++suffix; for(;*element; ++element, ++suffix) { if(**element != 0.0f) { if(**element >= 0.0f) out << '+'; out << **element << *suffix; } } return out ; }
-
Na dann erklär doch erstmal, wie die Ausgabe aussehen soll. Ist mir zu frickelig, als das ich mir das aus dem Code rauslesen will.
-
hi,
Badestrand schrieb:
Na dann erklär doch erstmal, wie die Ausgabe aussehen soll. Ist mir zu frickelig, als das ich mir das aus dem Code rauslesen will.
genau das ist das Problem: Die Funktion ist zwar kurz, aber unübersichtlich. Sie soll tun: Einen Quaternion in den ostream out ausgeben, und zwar so, dass keine "0i" "0j" "0k" vorkommen.
-
..,- schrieb:
hi,
Badestrand schrieb:
Na dann erklär doch erstmal, wie die Ausgabe aussehen soll. Ist mir zu frickelig, als das ich mir das aus dem Code rauslesen will.
genau das ist das Problem: Die Funktion ist zwar kurz, aber unübersichtlich. Sie soll tun: Einen Quaternion in den ostream out ausgeben, und zwar so, dass keine "0i" "0j" "0k" vorkommen.
P.S. "+-" soll auch nicht vorkommen.
-
Dann frag mal einen Profiler deiner Wahl, was er meint, wo du Zeit verbrätst und dann optimier die Stelle. So Pseudeoptimierung bringt nichts.
-
hi,
drakon schrieb:
Dann frag mal einen Profiler deiner Wahl, was er meint, wo du Zeit verbrätst und dann optimier die Stelle. So Pseudeoptimierung bringt nichts.
ich will eine Lesbarkeits-Optimierung, keine Geschwindigkeitsoptimierung.
-
Schon mit Kommentaren versucht?
-
Evtl so?:
std::ostream& print( std::ostream& out ) { const float list[] = { w, x, y, z }; const char* suffixes[] = { "", "i", "j", "k" }; bool first_valid_found = false; for ( int i=0; i<4; ++i ) { if ( list[i] != 0.0f ) { if ( first_valid_found && list[i]>0.0f ) out << "+"; first_valid_found = true; out << list[i] << suffixes[i]; } } if ( ! first_valid_found ) out << "0"; return out; }edit: Korrigiert, danke Fellhuhn.
edit2: Ne, stimmt immer noch nicht, wegenif(i>0), falls das erste Element 0 ist.
edit3: So, müsste jetzt hinhauen.
edit4+5: Mini-Korrekturen..
-
Das ist nicht das gleiche in dem Fall in dem x,y,z und w == 0 sind.
-
Hört mal auf hier Hausaufgaben zu machen, das ist ja schlimm.
-
hustbaer schrieb:
Hört mal auf hier Hausaufgaben zu machen, das ist ja schlimm.
Nö.
-
Badestrand schrieb:
hustbaer schrieb:
Hört mal auf hier Hausaufgaben zu machen, das ist ja schlimm.
Nö.
Koffer
-
Seit wann verhältst du dich so kindisch?
-
Wie wärs mit einem lesefreundlichen Designansatz:
typedef struct tagQuaternion { float a; float i; float j; float k; }Quaternion;( Ja is klar ne, geht auch als Klasse )

-
Leserlich ?
#include <iostream> #include <stdlib.h> using namespace std; typedef struct tagQuaternion { float a; float i; float j; float k; }Quaternion; void MyPrint( Quaternion* q, unsigned n ) { int i = 0; while ( i < n ) { if ( q[i].i != 0.0 && q[i].j != 0.0 && q[i].k != 0.0 ) printf ( "%E.3f %E.3f %E.3f %E.3f (n=%d)\n", q[i].a, q[i].i, q[i].j, q[i].k, i ); i++; } } int main(int argc, char *argv[]) { Quaternion Q[56]; MyPrint ( Q, 56 ); system("PAUSE"); return 0; }:p
-
Hier Ferrari!
Und da ist so viel falsch ich weiss gar nicht wo ich anfange soll, die performance zu erhöhen. Es ist so wichtig die Konsolen-Output-Performance zu erhöhen und deswegen ist es schlimm.
Würdest du nur ein paar minuten mit deiner Performance verbringen, würden wir hier jetzt alle nicht das problem haben. das ist das problem. (also!!)!! mach die performance um ein paar punkte besser dann funktioniert das auch.
Topcoder Ferrari!
-
hi,
Badestrand schrieb:
Evtl so?:
[...]ja, das ist gut. ich denke, wenn man first_valid_found in nonzero_found umbenennt, ist es recht optimal.
-
typedef struct tagQuaternion { float a; float i; float j; float k; }Quaternion;warum zum teufel ist es so verbreitet, ner klasse 2 verschiedene namen zu geben?
struct Quaternion { float a; float i; float j; float k; };sieht doch schon gleich viel besser aus...
bb
-
Viele Leute, die von C kommen, machen das halt noch mit
typedef struct. Warum man dazu aber zwei Bezeichner erstellt, von denen einer bei der Deklaration einstructvorne dran haben muss, kann ich dir auch nicht sagen.
-
Nexus schrieb:
...Warum man dazu aber zwei Bezeichner erstellt, von denen einer bei der Deklaration ein
structvorne dran haben muss, kann ich dir auch nicht sagen.
Das kommt bestimmt aus dem "Habe-ich-immer-so-gemacht-und-hat-immer-geklappt"-Lehrbuch.
Gruß,
Simon2.