Performancevergleich AnsiString::Pos vs. AnsiString::SubString



  • Eßer schrieb:

    QueryPerformanceCounter()

    Ich wollte eigentlich nicht wissen, wie man die Zeit misst ;), sondern wie deine Testanordnung aussah, also wofür/wovon du die Zeit gemessen hast.



  • *g*

    kannste haben:

    //UpperCase schneller?
    AnsiString src("FF00FF");
    
    bool temp;
    LARGE_INTEGER a;
    LARGE_INTEGER b;
    
    QueryPerformanceCounter(&a);
    temp = src.SubString(1, 2) != "0x" && src.SubString(1, 2) != "0X";
    QueryPerformanceCounter(&b);
    
    Memo1->Lines->Add(b.QuadPart-a.QuadPart);
    
    QueryPerformanceCounter(&a);
    temp = UpperCase(src).SubString(1, 2) != "0X";
    QueryPerformanceCounter(&b);
    
    Memo1->Lines->Add(b.QuadPart-a.QuadPart);
    
    //Pos oder SubString?
    
    AnsiString src("FF00FF");
    
    bool temp;
    LARGE_INTEGER a;
    LARGE_INTEGER b;
    
    QueryPerformanceCounter(&a);
    temp = UpperCase(src).SubString(1, 2) != "0X";
    QueryPerformanceCounter(&b)
    
    Memo1->Lines->Add(b.QuadPart-a.QuadPart);
    
    QueryPerformanceCounter(&a);
    temp = UpperCase(src).Pos("0X") == 0;
    QueryPerformanceCounter(&b);
    
    Memo1->Lines->Add(b.QuadPart-a.QuadPart);
    


  • Hmm, auf meinem Rechner ergibt das ein Verhältnis von rund 15:5 zugunsten von Pos() (kleiner = besser).
    Wenn allerdings zuerst Pos und dann SubString gemessen wird ergibt sich 11:7 zugunsten von SubString.
    Weisst du jetzt, warum ich nach der Methode gefragt habe? 😉

    Ich hab das mal etwas umgeschrieben, damit bekomme ich ein Verhältnis von 10:7 zugunsten von Pos, egal, was zuerst gemessen wird.

    int TestPos(String src)
    {
      bool temp;
      LARGE_INTEGER a;
      LARGE_INTEGER b;
    
      QueryPerformanceCounter(&a);
      for (int i = 0; i < 10000; i++)
        temp = UpperCase(src).Pos("0X") == 1;
      QueryPerformanceCounter(&b);
    
      return b.QuadPart - a.QuadPart;
    }
    
    int TestSub(String src)
    {
      bool temp;
      LARGE_INTEGER a;
      LARGE_INTEGER b;
    
      QueryPerformanceCounter(&a);
      for (int i = 0; i < 10000; i++)
        temp = UpperCase(src).SubString(1, 2) != "0X";
      QueryPerformanceCounter(&b);
    
      return b.QuadPart - a.QuadPart;
    }
    
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      AnsiString src("FF00FF");
    
      Memo1->Lines->Add("Sub: " + String(TestSub(src)));
      Memo1->Lines->Add("Pos:" + String(TestPos(src)));
    }
    

    PS. Mir fällt jetzt erst auf, dass man bei Pos natürlich auf 1 prüfen muss, nicht auf 0. 😉
    Hat aber auf die Testergebnisse keinen Einfluss



  • Ok, hast gewonnen. 😉

    Aber wieso ist ohne Schleife die zweite Messung immer die schnellere? 😕

    BTW: 15:5 = 3:1 😉

    BTW2: Du musst bei Pos auf 0 testen, weil wir wissen wollen, ob es NICHT drin ist. 😉



  • Eßer schrieb:

    Aber wieso ist ohne Schleife die zweite Messung immer die schnellere? 😕

    Gute Frage, keine Ahnung. 🙂

    BTW: 15:5 = 3:1 😉

    Tatsächlich? 😉
    Ich hab das extra so geschrieben um es besser mit den anderen Werten vergleichen zu können. Das tatsächliche Messergebnis war 30:10, ich hoffe du traust mir zu, das bei Bedarf vorschriftsmässig kürzen zu können. 😉

    BTW2: Du musst bei Pos auf 0 testen, weil wir wissen wollen, ob es NICHT drin ist. 😉

    Ähmm ... wollten wir nicht prüfen, ob es sich am Anfang des Strings befindet? 😉



  • Jansen schrieb:

    Ähmm ... wollten wir nicht prüfen, ob es sich am Anfang des Strings befindet? 😉

    Ok, hast recht... In den Ferien kann ich nicht richtig denken... 😃


Anmelden zum Antworten