Warum gibt es in diesem Text- / String -Parsing -Algorithmus einen Leistungsunterschied zwischen Rost und C ++?C++

Programme in C++. Entwicklerforum
Anonymous
 Warum gibt es in diesem Text- / String -Parsing -Algorithmus einen Leistungsunterschied zwischen Rost und C ++?

Post by Anonymous »

Ich erhalte sehr eigenartige Fahrzeugdaten bei der Arbeit in einer Textdatei. Die Datei hat einen großen Datenback als Speicherplatz getrennte Werte (42 Spalten,> 1.000.000 Zeilen) ; Manchmal mit +/- Zeichen. Ich schrieb einen Parser, um diese Saiten in den Vektor von Doppel in Rost und C ++ zu trennen. Führte sie beide in Release (-O3) Modus unter Windows 10 und WSL. War etwas Unidiomatisches in C ++? Unten finden Sie die Engpassfunktion:
Rost -Implementierung:

Code: Select all

/// Function separates the string of data into vector of vectors of f64 (double)
/// so that the precision is maintained
fn separate_data_to_vec(str_to_convert: &str) -> Vec {
let reader = BufReader::new(str_to_convert.as_bytes());
let mut output_vec: Vec = vec![];

for line in reader.lines() {
let line = line.expect("Coult not read line");
let mut nums_as_strs: Vec = line.split(" ").collect();
nums_as_strs.pop();

let data_nums: Vec = nums_as_strs
.iter()
.map(|v| {
let v: f64 = v.parse().unwrap_or(0.0);
v
})
.collect();
output_vec.push(data_nums);
}

output_vec
}
C ++ Implementierung:

Code: Select all

std::vector separate_data_to_vec(std::string &str_to_convert) {
std::istringstream reader(str_to_convert);
std::vector output_vec;

// Tried reserving too but in vain
// output_vec.reserve(2'000'000);

std::string line;
while (std::getline(reader, line)) {
std::stringstream ss(line);
std::vector data_nums;
std::string num_str;

while (std::getline(ss, num_str, ' ')) {
if (num_str.empty()) {
continue;
}
// Tried by removing the try catch -- differences stay
try {
data_nums.push_back(std::stod(num_str));
}
catch (const std::invalid_argument& ia) {
std::cerr

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post