2016-06-23 6 views
-3

Ich habe 100.000 Std :: Strings in der Form YYYYMMDD.HHMMSS, z. "20160621.213500", die ich brauche, um eine Struktur mit einigen Werten, einschließlich eines Epochenzeitstempels, zu analysieren und zu füllen.Langsame mktime beim Analysieren 100.000 YYYYMMDD.HHMMSS Zeichenfolgen in C/C++

Es läuft sehr langsam und der Schuldige ist der Anruf zu mktime. Irgendeine Alternative, um dies zu beschleunigen?

#define STRNCPY(dest, src, len) \ 
    { memcpy((dest), (src), (len)) ; dest[(len)] = '\0'; } 

void 
DvStorUtils::parseDateTimeString(const char *dateTimeStr, TDateTime &dateTime) 
{ 
    // New, C-Style implementation 
    strcpy(dateTime.dateTimeStr, dateTimeStr); 

    char buf[32]; 
    STRNCPY(buf, dateTimeStr, 4); dateTime.year = atoi(buf); 
    STRNCPY(buf, dateTimeStr+ 4, 2); dateTime.month = atoi(buf); 
    STRNCPY(buf, dateTimeStr+ 6, 2); dateTime.day = atoi(buf); 
    STRNCPY(buf, dateTimeStr+ 9, 2); dateTime.hour = atoi(buf); 
    STRNCPY(buf, dateTimeStr+11, 2); dateTime.minute = atoi(buf); 
    STRNCPY(buf, dateTimeStr+13, 2); dateTime.second = atoi(buf); 


    struct tm tmStruct; 
    tmStruct.tm_year = dateTime.year - 1900; 
    tmStruct.tm_mon = dateTime.month-1; 
    tmStruct.tm_mday = dateTime.day; 
    tmStruct.tm_hour = dateTime.hour; 
    tmStruct.tm_min = dateTime.minute; 
    tmStruct.tm_sec = dateTime.second; 

    dateTime.totalSecElapsed = mktime(&tmStruct); 
} 
+0

Dieser Blogeintrag könnte von Interesse sein: https://gmbabar.wordpress.com/2010/12/01/mktime-slow-use-custom-function/ –

+4

Wie langsam ist langsam? Welcher Teil der gesamten Funktion ist der 'mktime()' Aufruf? – wilx

+0

Vielleicht könnten Sie die Arbeitslast zwischen Threads aufteilen? – wilx

Antwort

0

Jeremy hatte die richtige Idee - Mktime sehr sehr langsam.

Kommentar aus mktime und 100.000 Zeilen werden in einem Augenblick verarbeitet. Auch beim Ausdrucken jeder Zeile. Setzen Sie es zurück und dauert fast eine Minute.

Ich ersetzte Mktime mit der Caching-Implementierung libfast-mktime und es ist fast so schnell wie ohne Mktime überhaupt.

Das Memo libfast-mktime funktioniert hier gut, da jede Zeile zeitlich sehr nahe an denen davor ist.