mmap медленнее, чем getline?

Я сталкиваюсь с проблемой чтения / записи файлов (в гигабайтах) построчно.

При чтении многих форумов и сайтов (включая множество SO), mmap был предложен как самый быстрый вариант для чтения / записи файлов. Однако, когда я реализую свой код с помощью методов readline и mmap, mmap медленнее из двух. Это верно как для чтения, так и для письма. Я тестировал файлы размером ~ 600 МБ.

Мои реализации анализируют строку за строкой, а затем токенизируют строку. Я представлю только ввод файла.

Вот реализация getline :

void two(char* path) {

    std::ios::sync_with_stdio(false);
    ifstream pFile(path);
    string mystring;

    if (pFile.is_open()) {
        while (getline(pFile,mystring)) {
            // c style tokenizing
        }
    }
    else perror("error opening file");
    pFile.close();
}

и вот mmap :

void four(char* path) {

    int fd;
    char *map;
    char *FILEPATH = path;
    unsigned long FILESIZE;

    // find file size
    FILE* fp = fopen(FILEPATH, "r");
    fseek(fp, 0, SEEK_END);
    FILESIZE = ftell(fp);
    fseek(fp, 0, SEEK_SET);
    fclose(fp);

    fd = open(FILEPATH, O_RDONLY);

    map = (char *) mmap(0, FILESIZE, PROT_READ, MAP_SHARED, fd, 0);

    /* Read the file char-by-char from the mmap
     */
    char c;
    stringstream ss;

    for (long i = 0; i <= FILESIZE; ++i) {
        c = map[i];
        if (c != '\n') {
            ss << c;
        }
        else {
            // c style tokenizing
            ss.str("");
        }

    }

    if (munmap(map, FILESIZE) == -1) perror("Error un-mmapping the file");

    close(fd);

}

Я пропустил много проверок ошибок в интересах краткости .

Моя реализация mmap неверна и влияет на производительность? Возможно, mmap не идеален для моего приложения?

Спасибо за любые комментарии или помощь!

5
задан Ian 11 July 2011 в 21:29
поделиться