Ressourcen schonen

  • @Kay

    Die Ignore-Funktion hat irgendwie einen Fehler.

    +++

    Ich bin es leid.

    Ich bin es leid, hier im Forum meine Zeit zu opfern.

    Ich bin es leid, hier deutlich mehr hereinzustecken, als herauszubekommen.

    Ich bin es leid, dass Leute etwas schreiben, was zwei Beiträge später ganz anders gemeint war.

    Ich bin es leid, eine Sachdiskussion in persönlichen Angriffen enden zu sehen.

    Ich bin es leid. Einfach leid.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Es tut mir leid.

    Es tut mir leid, andern die Zeit zu stehlen.

    Es tut mir leid, mehr herauszubekommen, als hereinzustecken.

    Und ich bin dir sehr sehr dankbar, dass du mit deinem Wissen, deiner Geduld, und deiner Schreib- und Programierkunst viel Kultur in dieses Forum und damit in die OS-X Entwicklerszene bringst!

    Übrigens noch dies in meinem Code Betreff zickzack gefunden.

    Quellcode

    1. if((xtmp>0)&(xtmp<1.0)){
    2. glVertex2f (xtmp, yOffsetMarkerLine+yOffsetZickZack*zickzack);
    3. glVertex2f (xtmp, 1.0);
    4. zickzack=(++zickzack)%4;
    5. }


    Gruss, Oliver
  • Ich habe überreagiert und mit dir hat es ohnehin der Falsche abbekommen.

    Als ich deine Mail las, wollte ich meinen Beitrag löschen, sah aber, dass du bereits an einer Antwort sast. Das wäre ja nun auch unfair.

    Ansonsten: Siehe Mail. Deine Kritik ist durchaus berechtigt.

    BTW: Im Code sollte es && statt & heißen. ;)

    BTW: Hast du meine letzte Mail bekommen? Irgendwie spinnt web.de in letzter Zeit.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Zurück zum Thema:
    Bindings sind auf tiefer Ebene von Apple mit Bedacht auf Hochperformance implementiert worden.

    Sobald du ein zweites View, welches das Attribut anzeigt, besteht die Alternative in manuellen Display-Listen. Das wird nicht schneller.

    Abstraktion bedingt eine Indirektion. Indirektion kostet Laufzeitverhalten.
    Abstraktion bringt Verstehen. Verstehen bringt Laufzeitverhalten.

    Es lässt sich einfach nicht abstrakt werten.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • RE: Ressourcen schonen

    Original von MCDan
    Bei Verwendung einer NSTableDataSource müsste man doch ein reloadData auf den NSTableView triggern, oder?

    Naja, man kann auch per dataSource einzelne Zellen aktualisieren ([tv setNeedsDisplayInRect:[tv frameOfCellAtColumn:col row:row]]), aber Du hast vollkommen Recht: Bindings machen das schon ausgezeichnet - wozu soll man den Aufwand treiben, wenn es schon einen ziemlich genialen Mechanismus dafür gibt? Bei solchen Sachen ist es schon eine mutige Herausforderung, schlauer als Bindings sein zu wollen...
    Multigrad - 360°-Produktfotografie für den Mac
  • RE: Ressourcen schonen

    Original von obb
    Da wird die Position über die Wellenform gezeichnet (OpenGL mit gebufferter Texture, dank dir), und zum anderen eben die Zeit-Anzeige mit TextField. (Oben habe ich fälschlicherweise TextView geschrieben).

    Timecode-Anzeigen sind interessant, weil viele Nutzer beim Abspielen in der Tat unsinnig und unlesbar schnell durchlaufende Zahlen erwarten. Vielleicht wäre es da sinnvoll, sich einen Custom View zu basteln, der nicht jedes Mal das komplette Textlayout anwirft (sind ja normalerweise Monospace-Fonts und es ändert sich meistens nur ein kleiner Teil) - und die maximale Ausgabegeschwindigkeit drosselt. Ich hatte mal eine Timecode-Anzeige, die das Ganze auf 7/100-Sekunden begrenzt hat - weil bei der Rate die Zehntel noch sauber durchlaufen und bei den Hundertsteln eine wild aufeinanderfolgende Ziffernfolge entsteht, genau das, was die Leute zu sehen erwarten. Für manuelle Positionierung reicht die Reaktionszeit auch locker. Aber auch hier wäre für mich die Frage, wie ich das Model sauber vom View entkoppele, was die Eigenschaft und was die Ansicht davon ist. Wie das geht, hängt von der Modellierung der Abspielposition ab.

    Zum OpenGL-View hatte ich, glaube ich, schon im damaligen Thread erwähnt, dass es sich auch bei OpenGL-Views lohnen kann, nicht immer alles neu zu zeichnen, sondern den Dirty-Rect-Mechanismus von Cocoa zu nutzen. Ob das (und das Limit der TC-Anzeige) wirklich etwas bringt, kann ich nicht sagen - Shark schon eher.
    Multigrad - 360°-Produktfotografie für den Mac
  • Original von below
    Aber der theoretische Informatiker würde ja zu Bindings vs. keine Bindings sagen, dass sich da sowieso nur maximal ein linearer Faktor rausholen lässt, die Geschichte von der Komplexität her also gleich bleibt ;)

    Stimmt - wenn man's richtig macht, sollte das so sein, bezüglich Laufzeitverhalten. Beim Entwicklungszeitverhalten sieht das vermutlich ganz anders aus... ;)
    Multigrad - 360°-Produktfotografie für den Mac
  • RE: Ressourcen schonen

    Original von Tom9811
    Und das meint auch Knuth: Er ist sicherlich *für* den Ansatz mit einem guten Design, welches nachher punktuell verbessert werden kann.

    Knuth würde so etwas vermutlich mit Literate Programming machen: Ein gutes Design, das später nicht mehr verbessert werden muss - aber wahrscheinlich steht die endgültige Antwort erst im siebten Band... :)
    Multigrad - 360°-Produktfotografie für den Mac
  • RE: Ressourcen schonen

    Dank für Einschätzung.

    Eben nur rein intuitiv habe ich folgendes gedacht.
    OpenGL wirkt für mich extrem schnell. Nur die Zeichnung zu generieren ist, da kompliziert, langsam.
    Von daher bin ich schon sehr zufrieden, auch wenn opengl jedes mal die ganze Texture neu ausgibt.

    Bei den Cocoa-Bindings habe ich momentan noch das Vorurteil, dass da viel gearbeitet wird, bis dann schlussendlich einen Text auf den Bildschirm gemalt wird. Nicht das malen selber, sondern das holen der Daten.
    Werde um mir ein Urteil machen zu können, morgen einiges dazu lesen. Bis dahin gild dann der Satz des Donald Knuth.

    Gruss, Oliver
  • RE: Ressourcen schonen

    Bei literarischer Programmierung wundert es mich nicht, wenn die Antwort auf sch warten lässt. ;)

    Ich ärgere mich ja selbst häufig genug darüber, wie wenig ich kommentiere. Aber für literarische Programmierung bin ih einfach zu neugierig auf die Problemlösung, die praktische, nicht die theoretische. Da fehlt mir einfach die Geduld.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • RE: Ressourcen schonen

    Hier ein erster Holzhammertest.
    Es gibt zwei TextFields.
    Eines ist gebunden an eine NSNumber (counter2), das andere wird über ein Outlet mit einer zweiten Number (counter1) bedient.
    Es ist sicher kein gescheiter Performance-Test, da einfach der Wert 100000 in counter1 bzw. counter2 geschrieben wird.
    Beim einen Loop wird zusätzlich der Wert über Outlet ins textfield geschrieben. Beim anderen Loop wird der Wert dann über Bindings abgeholt.

    Messung ohne Binding: 0.22 Sekunden.
    Messung mit Binding: 1.48 Sekunden.

    Siehe Anhang

    Gruss, Oliver
  • RE: Ressourcen schonen

    Ich hab' mir nicht ganz genau angesehen, was Dein Test macht, aber anscheinend geht es da nicht um das Rendern des Textes (ich habe ihn zumindest nicht gesehen). Egal - auch so gibt er Dir die Sicherheit, dass das Optimieren an der Stelle nichts bringt:

    1,26 Sekunden Differenz auf 100000 Werte sind selbst bei einem üppigen Framecap von 30 fps (und einem entsprechend gedrosselten Datenfluss vom Model zum View) ein Sparpotenzial von 0,000378s pro Sekunde, also etwa 0,04 Prozent Prozessorlast. Also sitzen die Performancefresser vermutlich woanders. Anders sieht die Sache natürlich aus, wenn Du den Wert unnütz häufig überträgst. Dann dürfte aber das Rendern erheblich mehr ziehen als die Übertragung - das wäre mal ein interessanter Performancetest, andererseits hast Du doch schon Deine Anwendung und kanns das Profiling gleich am Patienten machen, oder?
    Multigrad - 360°-Produktfotografie für den Mac
  • RE: Ressourcen schonen

    Wie schon ganz am Anfang gesagt. Es geht bei meiner Frage eigentlich nur darum, wie viel "kostet" der Komfort der Bindings.
    Und das kostet in diesem Fall (der Text wird ja erst gar nicht upgedatet) auf jeden Fall 6.7 mal mehr Zeit als wenn ich werte über Outlets übertrage.
    Mit dieser Erkenntnis kann ich von Fall zu Fall entscheiden. Ich kann mir jetzt aber gut vorstellen, dass in vielen Fällen die Prozessor- Mehrbelastung nicht ins Gewicht fällt, dafür die Vorteile gut angewandter Bindings dem Nutzer und dem Entwickler mehr bringen.
    Ich werde jetzt noch ausprobieren, wie es ist, wenn viel viel mehr bindings angemeldet sind.

    Gruss, Oliver
  • RE: Ressourcen schonen

    Wenn ich 40 Numbers mit dazugehörigen Bindings zu NSTextFields erstelle, welche aber gar nie geändert werden, erhöht sich die Ausführungszeit auf ca 4 Sekunden.
    Also schon 18 mal so viel Zeit.
    Wahrscheinlich müssen ja alle angemeldeten Bindungs abgeklappert werden.

    1000 mal in counter2 braucht ca 4 Sekunden.

    Quellcode

    1. for(n=0;n<m;n++){
    2. index=1+n%39;
    3. [self setCounter2:[NSNumber numberWithFloat:n]];
    4. }


    1000 mal auf alle 40 counter verteilt braucht nur 3.7 Sekunden!

    Quellcode

    1. for(n=0;n<m;n++){
    2. index=1+n%39;
    3. [self setValue:[NSNumber numberWithFloat:n]
    4. forKey:[NSString stringWithFormat:@"counter%d",index]];
    5. }


    Braucht auch unter 4 Sekunden.

    Quellcode

    1. [self setValue:[NSNumber numberWithFloat:n] forKey:@"counter2"];

    Würde heissen das setValue forKey schneller ist, als das Objekt direkt zu benennen.
  • RE: Ressourcen schonen

    Original von obb
    Wie schon ganz am Anfang gesagt. Es geht bei meiner Frage eigentlich nur darum, wie viel "kostet" der Komfort der Bindings.
    Und das kostet in diesem Fall (der Text wird ja erst gar nicht upgedatet) auf jeden Fall 6.7 mal mehr Zeit als wenn ich werte über Outlets übertrage.
    Mit dieser Erkenntnis kann ich von Fall zu Fall entscheiden.


    Ich weiß ehrlich nicht, was die Zahl 6,7 an anwendbarer Erkenntnis bringen soll - das Beispiel ist ja insofern realitätsfremd, dass man normalerweise Daten an einen View gibt, damit der etwas damit macht (typischerweise sie darzustellen). Und sobald man den Renderaufwand dazu nimmt, ist der Faktor ein ganz anderer. In Deinem Beispiel wird ja nichts dargestellt, weil die Schleife den Hauptthread blockiert. Ich habe mir mal den Spaß eines anderen Vergleichs gegönnt. Dein Testprogramm, TextField über Outlet: Einmal so wie es war (ohne Darstellung) und einmal mit erzwungenem Rendering ([text1 display] nach dem setObjectValue) - um zu sehen, wie das Verhältnis zwischen Transfer und Darstellung ist.

    Ohne -display: 0,18s
    Mit -display: 1562,75s (eine knappe halbe Stunde)

    Jetzt kann man natürlich über vier Sekunden mehr oder weniger bei Bindings diskutieren (es wären dann 1566s) - und man kann das sicherlich ganz toll optimieren, aber angesichts dieser Verhältnisse vermute ich, dass das nicht viel bringen wird. Die Rechenzeit versickert in der Zeichenroutine des TextFields. Wenn es mein Projekt wäre, würde ich mir überlegen, wie ich die Darstellung effizienter bekomme - unabhängig von Bindings oder nicht.
    Multigrad - 360°-Produktfotografie für den Mac
  • Also jetzt verstehe ich dich nicht (mattik)

    Es geht doch nur darum den Unterschied zweischen Binding und direktem Zugriff festzustellen, also diesen Mechanismus zu isolieren und zu untersuchen. Genau da wäre ja das Rendern von irgendwas ein Faktor der enorm verzerrt.

    Ich hab nun keine Ahnung, ob obbs Teststellung tatächlich den Mechanismus der Bindings einigermaßen isoliert untersucht. Aber es wäre auf alle Fälle ein bemerkenswertes Ergebnis.

    Ob das in der Praxis dann greift ist was anderes. Ist irgendwie so wie der Vergleich eine c Funktion aufzurufen und eine ObjC Methode zu benachrichtigen. Die c Funktion ist schneller, wenn ich dann aber in der Funktion eine Nuklearexplosion durchrechne durfte der eigentliche Aufruf wohl kaum ins Gewicht fallen.

    Aber die Frage ist nicht, wie groß der Unterschied zwischen Bindings/Direktaufruf und den Zeichnen einer View ist, sondern der Unterschied zwischen Binding und Direktaufruf.
    Seminare, Artikel, Code. ObjectiveCeeds - alles für die Apfelzucht.
  • RE: Ressourcen schonen

    Original von mattik
    Ich weiß ehrlich nicht, was die Zahl 6,7 an anwendbarer Erkenntnis bringen soll.

    Zusammen mit deiner Messung, die ich so nicht erwartet hätte , sagt es mir, dass die Bindings fast nie das Problem sein werden.
    Und dass ich in Zukunft setValue forKey, welchem ich auch Trägheit zugetraut hätte in einem ganz anderen Licht sehe.

    Dank und Gruss, Oliver
  • Original von kressevadder
    Also jetzt verstehe ich dich nicht (mattik)

    Es geht doch nur darum den Unterschied zweischen Binding und direktem Zugriff festzustellen, also diesen Mechanismus zu isolieren und zu untersuchen. Genau da wäre ja das Rendern von irgendwas ein Faktor der enorm verzerrt.

    Es kommt drauf an, was man messen bzw. vergleichen will. Obbs Test ist in der Tat interessant, weil er den Kern der Mechanismen isoliert. Sozusagen ein Laborversuch. Da kommt raus, das Bindings um ein Vielfaches langsamer sind als ein direkter Push. Das ist doof, andererseits aber auch verständlich, schließlich hängt eine ganze Indirektionsebene dazwischen - der direkte setObjectValue wird vermutlich nicht viel mehr machen als sich das Objekt zu merken und needsDisplay zu setzen.

    Der Faktor 6,7 ist unbestritten eine Erkenntnis. Meine Anmerkung bezog sich darauf, inwiefern diese Erkenntnis im Programmieralltag _anwendbar_ ist, insb. auf die ursprüngliche Situation: Ein Wert im Model ändert sich häufig und soll flüssig in ein TextField übertragen werden. Und da weichen die isolierten Laborergebnisse erheblich vom Feldtest ab - im Feldtest sollte man in einem realistischen Szenario messen. Und da halte ich es für realistischer, dass das TextField die Werte auch anzeigt.

    Kurz: Bindings sind isoliert betrachtet erheblich langsamer als direkter Zugriff, aber im Fall von TextFields, die ihre Werte anzeigen, liegt der Laufzeitunterschied im Promillebereich. Deshalb bieten andere Stellen vermutlich größeres Optimierungspotenzial.
    Multigrad - 360°-Produktfotografie für den Mac