java read 慢_由于memcpy,C ifstream :: read很慢

最近我决定优化我正在做的一些文件读取,因为正如大家所说,将大量数据读取到缓冲区然后使用它比使用大量小读取更快 . 而且我的代码现在肯定要快得多,但在进行一些分析之后,似乎memcpy占用了大量的时间 .

我的代码的要点是......

ifstream file("some huge file");

char buffer[0x1000000];

for (yada yada) {

int size = some arbitrary size usually around a megabyte;

file.read(buffer, size);

//Do stuff with buffer

}

我正在使用Visual Studio 11,在对我的代码进行分析后,它说 ifstream::read() 最终调用 xsgetn() ,它从内部缓冲区复制到我的缓冲区 . 此操作占用超过80%的时间!排在第二位的是 uflow() ,它占据了10%的时间 .

有什么方法可以绕过这个复制吗?我可以以某种方式告诉 ifstream 将我需要的大小直接缓冲到我的缓冲区中吗? C风格 FILE* 也使用这样的内部缓冲区吗?

更新:由于人们告诉我使用cstdio ...我做了一个基准测试 .

编辑:不幸的是旧的代码充满了失败(它甚至没有读取整个文件!) . 你可以在这里看到:http://pastebin.com/4dGEQ6S7

这是我的新基准:

const int MAX = 0x10000;

char buf[MAX];

string fpath = "largefile";

int main() {

{

clock_t start = clock();

ifstream file(fpath, ios::binary);

while (!file.eof()) {

file.read(buf, MAX);

}

clock_t end = clock();

cout << end-start << endl;

}

{

clock_t start = clock();

FILE* file = fopen(fpath.c_str(), "rb");

setvbuf(file, NULL, _IOFBF, 1024);

while (!feof(file)) {

fread(buf, 0x1, MAX, file);

}

fclose(file);

clock_t end = clock();

cout << end-start << endl;

}

{

clock_t start = clock();

HANDLE file = CreateFile(fpath.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_ALWAYS, NULL, NULL);

while (true) {

DWORD used;

ReadFile(file, buf, MAX, &used, NULL);

if (used < MAX) break;

}

CloseHandle(file);

clock_t end = clock();

cout << end-start << endl;

}

system("PAUSE");

}

时代是:

185

80

78

好吧......看起来使用C风格的fread比ifstream :: read更快 . 同样,使用Windows ReadFile只能提供一点点优势,这可以忽略不计(我查看了代码,fread基本上是ReadFile的包装器) . 看起来我毕竟会转向恐惧 .

男人写一个真正测试这个东西的基准测试是很困惑的 .

结论:使用 比 快 . fstream较慢的原因是因为c流有自己的内部缓冲区 . 每当您进行读/写操作时,这会导致额外的复制,并且此复制会占用fstream所花费的整个额外时间 . 更令人震惊的是,所花费的额外时间比实际读取文件所花费的时间长 .

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值