АШ>Хочу сравнить эффективность своего варианта с предложенным. Не сочтите за труд. Пусть входной файл будет в 1Mb.

vc71, release, оптимизация по скорости.

// file2vect.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <Windows.h>
#include <vector>
#include <iostream>
#include <fstream>

using namespace std;

int _tmain( int argc, _TCHAR* argv[] )
{
    DWORD t1 = GetTickCount();

    ifstream inputFile( "E:\\PROJECTS\\VC71\\tests\\file2vect\\filename.txt", ios::in | ios::binary );

    if( !inputFile )
    {
        cout << "file open error!!!" << endl;
        return 1;
    }

    vector<char> filedata( ( istreambuf_iterator<char>( inputFile ) ),  istreambuf_iterator<char>() );

    DWORD t2 = GetTickCount();

    cout<< "vector size = " << filedata.size() << ", loading time  = " << t2 - t1 << " ms." << endl;

    return 0;
}


вывод, несколько запусков:

vector size = 2027953, loading time  = 211 ms.
vector size = 2027953, loading time  = 210 ms.
vector size = 2027953, loading time  = 210 ms.
vector size = 2027953, loading time  = 211 ms.


второй вариант:

// file2vect2.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <windows.h>
#include <iostream>
#include <fstream>
#include <vector>
#include <time.h>

using namespace std;

int main()
{
    DWORD t1 = GetTickCount();

    std::ifstream f("E:\\PROJECTS\\VC71\\tests\\file2vect\\filename.txt", std::ios::in | std::ios::binary);

    if( !f )
    {
        cout << "file open error!!!" << endl;
        return 1;
    }

    std::vector<char> buffer;
    std::ifstream::pos_type size = 0;

    if( f.seekg(0, std::ios::end) )
    {
       size = f.tellg();
    }

    if( size && f.seekg(0, std::ios::beg) )
    {
       buffer.resize(size);
       f.read(&buffer[0], size);
    }
    
    DWORD t2 = GetTickCount();

    cout<< "vector size = " << buffer.size() << ", loading time  = " << t2 - t1 << " ms." << endl;

    return 0;
}


вывод, несколько запусков:

vector size = 2027953, loading time  = 20 ms.
vector size = 2027953, loading time  = 10 ms.
vector size = 2027953, loading time  = 20 ms.
vector size = 2027953, loading time  = 10 ms.


с чем вас и поздравляю

на больших файлах различия несколько сглаживаются:

E:\PROJECTS\VC71\tests\file2vect\file2vect\Release\file2vect.exe
vector size = 322525944, loading time  = 88187 ms.

E:\PROJECTS\VC71\tests\file2vect\file2vect2\Release\file2vect2.exe
vector size = 322525944, loading time  = 37514 ms.
Автор: Odi$$ey    Оценить