Ist das hier Marshalling?



  • Abend,

    ich habe eine Winforms C++/CLI Anwendung, in der ich nativen C++ Code aus einer Lib verwende. Um folgende Zeile in meiner C++/CLI WinForms Anwendung geht es:

    IntersectionResult result;
    bool isIntersecting = patch->computeRayIntersection(result, viewRay);
    
    tbxX->Text = result.position.x.ToString("0.00");
    tbxY->Text = result.position.y.ToString("0.00");
    tbxZ->Text = result.position.z.ToString("0.00");
    
    // Intersection result sieht so aus:
    struct IntersectionResult {
       Vector3 position;
       Vector3 normal;
    };
    

    Patch::computeRayIntersection() ist eine native C++ Methode aus der Lib. Das Ergebnis ist eine kleine Struktur (auch aus der Lib), bestehend aus 2 Vektoren (auch beide natives C++ aus der Lib).
    Das erstaunliche ist nun: Die 3 Zuweisungen (Zeilen 4-6) an das Property Text (Typ String^) von tbxX, tbxY und tbxZ (das sind 3 C++/CLI Textboxen vom Typ System::Windows::Forms::TextBox^) sind recht langsam! Passiert hier irgend eine Marshalling Magie? Hat wer eine Idee, wieso das langsam sein könnte? Und noch wichtiger: Kann ich dagegen was machen, so dass es schneller wird?

    Danke



  • Ja, meines Wissens passiert hier marshalling.
    Aber nimm doch einfach einen Profiler zur Hand und miss, wo die Zeit draufgeht.

    Simon



  • Naja, die Sache ist eindeutig. Wenn ich die Zeilen 4-6 auskommentiere, dann springt meine Anwendung von 600 auf 900 fps.

    Gibts da keine Möglichkeit diese Zuweisung zu beschleunigen?



  • Das marschaling passiert hier in Zeile 2.

    Zeilen 4-6 sind reiner .NET Code.

    Langsam sind die deswegen, weil das Ändern des Textes einer TextBox eben langsam ist. Step ruhig mal im Debugger rein (.NET reference source) - da wird einem hübsch übel wenn man sieht was da alles für ein "einfaches" textBox.Text = "sepp" passiert.

    Mal ganz davon abgesehen, dass selbst ein "einfaches" Win32 SetWindowText schon ziemlich lange braucht.

    Hat wer eine Idee, wieso das langsam sein könnte?

    Weil es .NET GUI Code ist.
    Wenn dir die Begründung nicht "gut genug" ist: weil das .NET Framework nicht auf performance optimiert ist, ganz speziell die GUI Komponenten. MS war es vermutlich wichtiger "gute" features anzubieten, schnell fertig zu werden, wenig bugs zu haben etc. Auf performance haben die da grösstenteils geschissen.

    Und noch wichtiger: Kann ich dagegen was machen, so dass es schneller wird?

    Klar. Nicht so oft den Text ändern.
    Ich kenne keinen der tausende Updates pro Sekunde lesen kann 😉



  • hustbaer schrieb:

    Und noch wichtiger: Kann ich dagegen was machen, so dass es schneller wird?

    Klar. Nicht so oft den Text ändern.
    Ich kenne keinen der tausende Updates pro Sekunde lesen kann 😉

    vor allem kaum ein Monitor hat mehr als 100Hz


Log in to reply