FABMASTER: Preallocate vectors

Reserves memory for vector elements based on file size.  This helps
reduce the number of re-allocations needed when reading large files
This commit is contained in:
Seth Hillbrand 2021-02-26 11:28:21 -08:00
parent e03bca3563
commit ff1300d13b
1 changed files with 16 additions and 0 deletions

View File

@ -86,9 +86,22 @@ bool FABMASTER::Read( const std::string& aFile )
m_filename = aFile;
// Read/ignore all bytes in the file to find the size and then go back to the beginning
ifs.ignore( std::numeric_limits<std::streamsize>::max() );
std::streamsize length = ifs.gcount();
ifs.clear();
ifs.seekg( 0, std::ios_base::beg );
std::string buffer( std::istreambuf_iterator<char>{ ifs }, {} );
std::vector < std::string > row;
// Reserve an estimate of the number of rows to prevent continual re-allocation
// crashing (Looking at you MSVC)
row.reserve( length / 100 );
std::string cell;
cell.reserve( 100 );
bool quoted = false;
for( auto ch : buffer )
@ -161,6 +174,9 @@ FABMASTER::section_type FABMASTER::detectType( size_t aOffset )
if( row.size() < 3 )
return UNKNOWN_EXTRACT;
if( row[0].back() != 'A' )
return UNKNOWN_EXTRACT;
std::string row1 = row[1];
std::string row2 = row[2];
std::string row3{};