Use std string for improved performance

Avoid regexp and use optimized string operations for better performance
This commit is contained in:
Magne Sjaastad
2025-07-17 13:52:35 +02:00
parent 2305a73908
commit 56d0ba0931
3 changed files with 76 additions and 14 deletions
@@ -116,39 +116,39 @@ void RifCaseRealizationParametersReader::parse()
int lineNo = 0;
QStringList errors;
const auto decimalPoint = RiaStdStringTools::decimalPoint();
while ( !dataStream.atEnd() )
{
QString line = dataStream.readLine();
lineNo++;
QStringList cols = RifFileParseTools::splitLineAndTrim( line, QRegularExpression( "[ \t]" ), true );
if ( cols.size() != 2 )
const auto stdLine = line.toStdString();
const auto trimmedLine = RiaStdStringTools::trimString( stdLine );
const auto [name, parameterValue] = RiaStdStringTools::splitAtWhitespace( trimmedLine );
if ( name.empty() || parameterValue.empty() )
{
errors << QString( "RifEnsembleParametersReader: Invalid file format in line %1" ).arg( lineNo );
errors << QString( "RifCaseRealizationParametersReader: Invalid file format in line %1" ).arg( lineNo );
continue;
}
QString& name = cols[0];
QString& strValue = cols[1];
if ( RiaTextStringTools::isNumber( strValue, QLocale::c().decimalPoint() ) )
if ( RiaStdStringTools::isNumber( parameterValue, decimalPoint ) )
{
bool parseOk = true;
double value = QLocale::c().toDouble( strValue, &parseOk );
if ( parseOk )
double doubleValue = 0.0;
if ( RiaStdStringTools::toDouble( parameterValue, doubleValue ) )
{
m_parameters->addParameter( name, value );
m_parameters->addParameter( QString::fromStdString( std::string( name ) ), doubleValue );
}
else
{
errors << QString( "RifEnsembleParametersReader: Invalid number format in line %1" ).arg( lineNo );
errors << QString( "RifCaseRealizationParametersReader: Invalid number format in line %1" ).arg( lineNo );
}
}
else
{
m_parameters->addParameter( name, strValue );
m_parameters->addParameter( QString::fromStdString( std::string( name ) ), QString::fromStdString( std::string( parameterValue ) ) );
}
}
@@ -10,6 +10,38 @@
static const QString CASE_REAL_TEST_DATA_DIRECTORY_01 = QString( "%1/RifCaseRealizationParametersReader/" ).arg( TEST_DATA_DIR );
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
TEST( RifCaseRealizationParametersReaderTest, MixOfTabAndWhiteSpace )
{
RifCaseRealizationParametersReader reader( CASE_REAL_TEST_DATA_DIRECTORY_01 + "parameters-mix-tab-whitespace.txt" );
try
{
reader.parse();
const std::shared_ptr<RigCaseRealizationParameters> parameters( reader.parameters() );
std::map<QString, RigCaseRealizationParameters::Value> params = parameters->parameters();
std::vector<std::pair<QString, double>> expectedValues = { { "LETSWOF:L_1OW", 1.83555 },
{ "LETSWOF:E_1OW", 5.84645 },
{ "LETSWOF:T_1OW", 1.46894 },
{ "LETSWOF:L_1WO", 4.9974 },
{ "LETSWOF:E_1WO", 3.38433e-05 } };
for ( const auto& expected : expectedValues )
{
EXPECT_EQ( expected.second, params[expected.first].numericValue() )
<< "Parameter value mismatch for: " << expected.first.toStdString();
}
}
catch ( ... )
{
EXPECT_TRUE( false );
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@@ -0,0 +1,30 @@
LETSWOF:L_1OW 1.83555
LETSWOF:E_1OW 5.84645
LETSWOF:T_1OW 1.46894
LETSWOF:L_1WO 4.9974
LETSWOF:E_1WO 3.38433e-05
LETSWOF:T_1WO 0.762342
LETSWOF:SORW1 0.13
LETSWOF:KRW1 0.778509
MULTFLT:MULTFLT_F1 0.678647
LOG10_MULTFLT:MULTFLT_F1 -0.168356
MULTFLT:MULTFLT_F2 0.0051102
LOG10_MULTFLT:MULTFLT_F2 -2.29156
MULTFLT:MULTFLT_F3 0.347461
LOG10_MULTFLT:MULTFLT_F3 -0.459093
MULTFLT:MULTFLT_F4 0.113
LOG10_MULTFLT:MULTFLT_F4 -0.946922
MULTFLT:MULTFLT_F5 0.521999
LOG10_MULTFLT:MULTFLT_F5 -0.28233
RMSGLOBPARAMS:FWL 1708.62
MULTZ:MULTZ_MIDREEK 3.38433e-05
LOG10_MULTZ:MULTZ_MIDREEK -4.47053
LETSGOF:L_1GO 2.04966
LETSGOF:E_1GO 1.85285
LETSGOF:T_1GO 1.39467
LETSGOF:L_1OG 3.90509
LETSGOF:E_1OG 4.00383
LETSGOF:T_1OG 1.03539
LETSGOF:SORG1 0.34
TST:TEXT_PARAM YES
LETSGOF:KRG1 0.97