dll - Geschwindigkeit verbessern



  • Hi, ich habe folgendes Problem: Ich hab mir eine dll gebaut, die einen eingegebenen Text mit einem Passwort mittels Xor verschlüsselt. Das ganze klappt ja soweit auch wunderbar, doch ist die Fuktion viel zu langsam. Komischerweise wird die Zeit um einen Charakter zu verschlüsseln im Programmverlauf immer länger, was sich vor allem bei mehr als 200'000 Zeichen erheblich bemerkbar macht. Ich hab schon mit dem Freeware Toll FreeRAM geprüft ob mir einfach der Speicher ausgeht, sowieso unwahrscheinlich bei 1GB RAM, doch dem ist eindeutig nicht so.

    Hier die Funktion:

    String^ Secret::VerEntschlüsseln(String^ SrcString, String^ Pass)
    	{
    		int TmpArray[20];
    
    		for(int Zähler = 0; Zähler <= Pass->Length - 1; Zähler++)
    		{
    			TmpArray[Zählerx] = int(Pass[Zählerx]);
    		}
    
    		wchar_t TmpInt = 0;
    		String^ Ausgabe = "";
    		int Modifier = 0;
    
    		for(int Zähler = 0; Zähler <= SrcString->Length - 1; Zähler++)
    		{
    			TmpInt = SrcString[Zähler];
    			for(int Zähler2 = 0; Zähler2 <= Pass->Length - 1; Zähler2++)
    			{
    				Modifier = Zähler|Zähler2;
    				TmpInt = TmpInt ^ TmpArray[Zähler2];
    				TmpInt = TmpInt ^ Modifier;
    			}
    
    			if (TmpInt > 0)
    			{
    				Ausgabe = Ausgabe + TmpInt;
    			}
    			else
    			{
    				Ausgabe = Ausgabe + "!?!";
    			}
    		}
    
    		Zähler = 0;
    		return Ausgabe;
    
    }
    


  • String^
    

    Was soll das sein. 😕

    Dabei handelt es sich schon mal um kein Standard C++ 🙄



  • Dieser Thread wurde von Moderator/in evilissimo aus dem Forum C++ in das Forum C++/CLI mit .NET verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • AberHallo schrieb:

    String^
    

    Was soll das sein. 😕

    Dabei handelt es sich schon mal um kein Standard C++ 🙄

    Sieht aus wie Pascal-Syntax



  • Hast Du mal einen Profiler drüberlaufen lassen?



  • if (TmpInt > 0)
                {
                    Ausgabe = Ausgabe + TmpInt;  // hier sind 3 stringobjekte versteckt
                }
                else
                {
                    Ausgabe = Ausgabe + "!?!";  // hier auch
                }
    

    Diese Zeilen sind dein Problem.
    Pro Zeile hast du 3 Stringobjekte! Wenn du nun n=200000 Zeichen verschlüsseln willst hast du im Programmverlauf ca. 3*( n + n-1 + n-2 + ... + 1)Objekte, und du glaubst gar net was das für ne große Zahl ist 😉



  • Sind verwaltete String-Objekte auf dem Heap, d.h. der GarbageCollector kümmert sich um solche Objekte...

    StringWriter^ ... {
    ...
    System:IO::StringWriter ^Ausgabe = new StringWriter;
    if (TmpInt > 0)
                {
                    Ausgabe->Add(TmpInt);  // hier sind 3 stringobjekte versteckt
                }
                else
                {
                    Ausgabe->Add("!?!");  // hier auch
                }
    return Ausgabe->ToString();
    }
    


  • Zickedi schrieb:

    Sind verwaltete String-Objekte auf dem Heap

    String Objekte sind was besonderes (immutable). Aber prinziell kann man sagen, dass sie vom GC aufgeräumt werden.
    Siehe:
    http://msdn2.microsoft.com/en-US/library/system.string



  • Hi, danke für eure Hilfe. Ich hab` jetzt die StringWriter Funktion eingebaut und tatsächlich, nun habe ich einen Durchsatz von ca. 1Mio. zeichen pro Sekunde, echt Spitze!

    Hier noch mein Code:

    ...
    StringWriter ^Ausgabe = gcnew StringWriter;
    ...
    
    if (TmpInt > 0)
    {
        Ausgabe->Write(TmpInt);
    }
    	else
    {
    	Ausgabe->Write("?!?");
    }
    ...
    
    return Ausgabe->ToString();
    

Anmelden zum Antworten