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...