Выполнение создания станд. C++:: строка от входного итератора

Проверьте ваш путь к Python, чтобы увидеть, где хранится ваш исполняемый файл Python --- which python в терминале. Бьюсь об заклад, он по-прежнему указывает на Python вашего каталога 3.7.2.

9
задан CAdaker 7 February 2009 в 21:09
поделиться

3 ответа

Я сравнил Вашей реализации (1), моя (2), и два других (3 и 4), что я нашел на stackoverflow.

Результаты (Среднее число 100 выполнений; синхронизированное использование gettimeofday, файл был 40 абзацами lorem ipsum):

  • readFile1: 764
  • readFile2: 104
  • readFile3: 129
  • readFile4: 402

Реализации:

string readFile1(const string &fileName)
{
    ifstream f(fileName.c_str());
    return string(std::istreambuf_iterator<char>(f),
            std::istreambuf_iterator<char>());
}

string readFile2(const string &fileName)
{
    ifstream ifs(fileName.c_str(), ios::in | ios::binary | ios::ate);

    ifstream::pos_type fileSize = ifs.tellg();
    ifs.seekg(0, ios::beg);

    vector<char> bytes(fileSize);
    ifs.read(&bytes[0], fileSize);

    return string(&bytes[0], fileSize);
}

string readFile3(const string &fileName)
{
    string data;
    ifstream in(fileName.c_str());
    getline(in, data, string::traits_type::to_char_type(
                      string::traits_type::eof()));
    return data;
}

string readFile4(const std::string& filename)
{
    ifstream file(filename.c_str(), ios::in | ios::binary | ios::ate);

    string data;
    data.reserve(file.tellg());
    file.seekg(0, ios::beg);
    data.append(istreambuf_iterator<char>(file.rdbuf()),
                istreambuf_iterator<char>());
    return data;
}
31
ответ дан 4 December 2019 в 06:57
поделиться

Что происходит с производительностью, при попытке делать это? Вместо того, чтобы спросить, "какой путь быстрее?" можно думать "эй, я могу измерить это".

Настройте цикл, который читает файл данного размера 10000 раз или чего-то и времени это. Затем сделайте это с reserve() метод и время, когда. Попробуйте его несколькими различными размерами файла (от маленького до огромного) и посмотрите то, что Вы получаете.

2
ответ дан 4 December 2019 в 06:57
поделиться

Чтобы быть честным, я не уверен, но от того, что я считал, это действительно зависит от итераторов. В случае итераторов из файла передает его потоком, вероятно, имеет не созданный в методе для измерения длины файла между начинанием и концом interator.

Если это будет корректно, то это будет работать чем-то подобным удвоению, это - размер внутренней памяти каждый раз, когда это исчерпывает пространство. В этом случае для n символов в файле будет Журнал [n, 2] выделения памяти, и удаления памяти и n*Log [n, 2] копии отдельного символа, сверх просто копирования символов в строку.

Как Greg указал, хотя, Вы могли бы также протестировать его. Как он сказал, пробуют его за множество размеров файла для обоих методов. Дополнительно можно использовать следующее для получения некоторых количественных синхронизаций.

#include<time.h>
#include<iostream>

...

clock_t time1=0, time2=0, delta;
float seconds;

time1=clock();

//Put code to be timed here

time2=clock();

delta= time2-time1;

seconds =(((float)delta)/((float)CLOCKS_PER_SEC));

std::cout<<"The operation took: "<<seconds<<" seconds."<<std::endl;

...

это должно добиться цели для синхронизации.

0
ответ дан 4 December 2019 в 06:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: