Я получаю очень своеобразные данные транспортных средств на работе в текстовом файле. Файл имеет большую часть данных как пространство разделенные значения (42 столбца,> 1 000 000 строк) ; Иногда есть знаки +/- . Я написал анализатор, чтобы разделить эти строки на вектор удвоения в ржавчине и C ++. Запустили их оба в режиме «-O3») в Windows 10 и WSL. Было ли что -то одноидиоматическое в C ++? Ниже приведена функция узкого места:
реализация ржавчины:
/// 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 ++:
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
Подробнее здесь: https://stackoverflow.com/questions/755 ... -string-pa
Почему в этом алгоритме анализа текста / строки существует разница в производительности между Rust VS C ++? ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение