在 Ubuntu 中解析数据的速度比 Windows 10 快
Parsing data quicker in Ubuntu than Windows 10
我正在将数据从.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;
}
如果这仍然很慢,我会非常感兴趣......
相关文章:
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 在Linux for Windows上编译C++代码时出错
- 在Windows上用C++裁剪HBITMAP
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 如何加载(或映射)文件部分的最大大小,但适合在Windows上的RAM
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- Windows 7 应用程序在未聚焦时运行速度较慢
- 在 Ubuntu 中解析数据的速度比 Windows 10 快
- 为什么windows第一次打开文件的速度这么慢,有没有更快的方法
- 试用版代码在 Windows 上的 32 位运行速度比在 Linux 上的 64 位快 2 倍
- Qt程序的速度性能:Windows与Linux
- 如何在Windows上检测USB速度
- LogoUser在Windows 7上返回速度较慢,凭据不正确
- Windows 服务生成的进程的运行速度比 GUI 生成的进程慢 3 到 4 倍
- 如果Windows资源管理器正在运行,Direct3D应用程序运行良好,否则速度会非常慢
- Windows XP在C++中启动时读取文本文件的速度较慢;预取
- Windows Phone 8上的模糊速度太慢
- 如何使用c++在Windows上提高读取数据的速度
- 在大型MFC windows应用程序中使用Qt会加快开发速度吗?
- 在windows中确定可移动驱动器速度的任何方法