gpt4 book ai didi

c++ - 将一个字符一个字符地处理为字符还是作为流,哪个更快更有效?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:18:05 26 4
gpt4 key购买 nike

如果我想在使用前逐个字符地处理一个文本文件。什么方法最有效?

我能做到:

ifstream ifs("the_file.txt", ios_base::in);
char c;
while (ifs >> noskipws >> c) {
// process c ...
}
ifs.close();

还有这个:

ifstream ifs("the_file.txt", ios_base::in);
stringstream sstr;
sstr << ifs.rdbuf();
string txt = sstr.str();
for (string::iterator iter = txt.begin(); iter != txt.end(); ++iter) {
// process *iter ...
}

最终输出将根据迭代时找到的字符拆分字符串。

哪个更快?或者也许还有另一种更有效的方法?我是否需要为每个字符刷新 stringstream(我在某处读到 flush 会影响性能)?

最佳答案

a) 测量(我猜第一个应该更快,因为它避免了额外的分配,但这只是一个猜测)

b) 虽然过早优化确实是一个非常糟糕的情况,但如果您真的需要最好的性能,请尝试以下方法:

int f = open(...);
//error handling here
char buf[256];
while(1) {
int rd = read(f,buf,256);
if( rd == 0 ) break;
for(const char*p=buf;p<buf+rd;++p) {
//process *p; note that this loop can be entered more than once
}
}
close(f);

我很确定在性能方面很难超越这段代码(除非进入非常低级的非标准 IO);但是,ifstream 很可能会产生可比较的结果。或者它可能不会。

注意:对于 C++,此技术(读取固定大小的缓冲区,然后扫描缓冲区)提供的差异很小且通常可以忽略不计,但对于其他语言,它可能很容易提供高达 2 倍的差异(已在 Java 上观察到)。

关于c++ - 将一个字符一个字符地处理为字符还是作为流,哪个更快更有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30548216/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com