在 Ubuntu 中解析数据的速度比 Windows 10 快

Parsing data quicker in Ubuntu than Windows 10

本文关键字:速度 Windows 数据 Ubuntu      更新时间:2023-10-16

我正在将数据从.txt文件(100 MB - 4 GB)流式传输和解析到矢量中。在 Ubuntu 19.04 中解析数据比在 Windows 10 中解析数据要快得多。我可以做些什么来加快 Windows 中的解析过程?

我已经在操作系统中使用std::getline测试了流媒体速度,并且流媒体速度相似。我已经 http://www.cplusplus.com/forum/general/254030/在一个单独的网站上发布了(我认为问题出在文件系统上),但我了解到这更多是由于以某种方式解析数据。除了使用代码中的运算符之外,我不确定是否有任何其他方法来解析数据。 以下是我用于解析数据以测试Windows和Ubuntu时间的代码:

unsigned int date, time, mil;
double last, bid, ask;
unsigned int volume;
char delim;
int lineCount{0};
if (dataFile.is_open())
{
while (dataFile >> date >> time >> mil >> delim >> last >> delim >> 
bid >> delim >> ask >> delim >> volume)
{
lineCount++;
}
}

以下是我用来读取文件以测试Windows和Ubuntu速度的代码:

int lineCount{0};
string line;
while (getline(dataFile, line))
{
lineCount++;
}

以下是每个操作系统上两个测试的结果:

Ubuntu 19.04 with parsing:
execution time : 1.352 s
Windows 10 with parsing:
execution time : 27.474 s
Ubuntu 19.04 without parsing (just reading file):
execution time : 0.059 s
Windows 10 without parsing (just reading file):
execution time : 0.922 s

我认为Linux和Windows的性能相似,但它们的结果却大不相同。我用于测试的文件只有 64.9 MB

如果没有探查器的结果和编译方式,要回答您的问题并不容易。

例如,如果在调试模式下在 MSVS 19 上运行程序,它将非常慢。如果您在发布模式下运行它,并启用所有优化,那么它将大大加快速度。

然后,下一步。运行探查器。它告诉您程序在哪里很慢。它不一定是解析,它最糟糕的是阅读。

通过使用更大的缓冲区,可以大大加快从文件读取的速度。然后,您还应该初始化矢量大小和保留大小。

并使用emplace_back而不是push_back.

请尝试以下操作:

#include <iostream>
#include <fstream>
#include <vector>

struct Data
{
unsigned int date, time, mil;
double last, bid, ask;
unsigned int volume;
};
int main()
{
// Create a vector with an big initial size
std::vector<Data> fullData(10000);
// If reallocation is neccessary, then use big data
fullData.reserve(20000);

// Variables to read
unsigned int date{}, time{}, mil{};
double last{}, bid{}, ask{};
unsigned int volume{};
char delim{};

std::ifstream dataFile;
// Big buffer for reading
char buf[100000];
// Set a big input buffer
dataFile.rdbuf()->pubsetbuf(buf, sizeof buf);
dataFile.open("yourFile.dat");
if (dataFile.is_open())
{
while (dataFile >> date >> time >> mil >> delim >> last >> delim >>
bid >> delim >> ask >> delim >> volume)
{
fullData.emplace_back(Data{ date, time, mil, last, bid, ask, volume });
}
}
return 0;
} 

如果这仍然很慢,我会非常感兴趣......