Performancebremse: SystemTimeToTzSpecificLocalTime()



  • Hallo zusammen,

    ich hab einen neuen Rechner auf der Arbeit, mit dem eigentlich alles viel schneller gehen sollte. Sollte...

    Leider läuft ein Programm um ein vielfaches langsamer als vorher, als Ursache konnte ich folgenden Code ausmachen:

    datum.DecodeDate(&jahr, &monat, &tag);
    datum.DecodeTime(&stunde, &minute, &sekunde, &millisekunde);
    
    // Umrechnung UTC -> LocalTime
    SYSTEMTIME systime;
    SYSTEMTIME localsystime;
    systime.wYear = jahr;
    systime.wMonth = monat;
    systime.wDay = tag;
    systime.wHour = stunde;
    systime.wMinute = minute;
    systime.wSecond = sekunde;
    systime.wMilliseconds = millisekunde;
    TIME_ZONE_INFORMATION tzi;
    GetTimeZoneInformation(&tzi);
    SystemTimeToTzSpecificLocalTime(&tzi, &systime, &localsystime); 
    datum = SystemTimeToDateTime(localsystime);
    

    Es ist genau diese Zeile

    SystemTimeToTzSpecificLocalTime(&tzi, &systime, &localsystime);
    

    die das ganze so fürchterlich langsam macht.

    Das Programm wertet Logfiles von einem Linux-System aus. Die Zeit muss von UTC in lokale Zeit umgerechnet werden. Dazu nutze ich die obige Funktion. Funktioniert prima, nur dauert es ca. 5 Minuten die jeweils knapp 300.000 Zeilen auszuwerten. Kommentiere ich die eine Zeile aus, ist das Programm in ein paar Sekunden fertig.
    Interessanterweise lief diese Funktion auf meinem uralten AMD XP3200+ (prä-64-bit-Ära!!) um ein vielfaches schneller, als auf meinem aktuellen i7 920...

    Hat jemand eine Idee, wie ich das ganze beschleunigen kann? Vorzugsweise, ohne dass ich selbst Beginn und Ende der Sommerzeit berechnen muss... 😉



  • Sieht sehr nach einem Problem fürs WinAPI-Subforum aus.



  • audacia schrieb:

    Sieht sehr nach einem Problem fürs WinAPI-Subforum aus.

    Das hab ich fast befürchtet... Es gibt in der VCL also nichts passendes?

    Im ersten Posting vergessen:
    OS ist Win XP Pro SP3, Borland C++ Builder 6. Softwareseitig hat sich praktisch nichts geändert, außer dass ich auf einen neuen Rechner umgezogen bin und ich deswegen neu installieren mußte.



  • Joe_M. schrieb:

    Es gibt in der VCL also nichts passendes?

    Kann schon sein; du könntest mal schauen, ob du mit den Feldern von TIME_ZONE_INFORMATION und den Funktionen im DateUtils-Unit etwas hinbekommst. (Ob es das in C++Builder 6 schon gibt, weiß ich nicht.)



  • In der Sqltimst.hpp des BCB2009 gibts die Funktion UTCToLocal.
    (Source: Sqltimst.pas)
    Eventuell kommst du damit weiter...

    edit
    Upps, lese gerade, dass du Ver.6 benutzt. Sorry...



  • Hast du alle Optimierungen(Anweisungs-Set) des Compilers für deine neue Cpu aktiviert?

    ...hat deine Version sowas? (ich kenne nur Version 2007 und 2009)



  • Ok, ich habe aufgegeben. Ich hab in der VCL nichts gefunden, die WinAPI ist mir zu obskur...
    Ich berechne jetzt Sommerzeitbeginn und -ende selbst. Das Programm ist jetzt in 2 Sekunden, statt in 5 Minuten mit der Auswertung fertig.

    Danke an alle.


Anmelden zum Antworten