【发布时间】:2014-09-20 17:39:12
【问题描述】:
我在输入流中有大约1E6 行(来自键盘)。以下是我的阅读方式:
int main () {
ul n, in;
scanf("%lu", &n);
ul *a = new ul[n];
while(n--){
scanf("%lu", a+n);
}
n 是要读取的行数。
ul 是 unsigned long 我在其他地方定义的。
为了澄清,数据是一串整数 (1E9),由键盘输入流中的换行符 (\n) 分隔。
这种方法可以完成工作,但我想加快速度。 我曾考虑过使用缓冲区将整个流读取到内存并进行解析,但我不知道如何使用 C++ 11。
我使用stdio.h 来读取流,因为它似乎比 C++ 流读取器更快。否则,我更喜欢 C++ 11 解决方案。
【问题讨论】:
-
“因为它似乎比 C++ 流阅读器更快”——它不是,这是一个难以消除的神话。 C 和 C++ 流几乎完全一样,理论上 C++ 流可以更快(尽管我知道没有实现可靠的情况)。
-
嗯,让我们看看。一百万个整数还不错。作为文本,它可能是几十兆。如今,它很容易装入 RAM。您可以使用
std::istreambuf_iterators 初始化std::string,以便将整个文件读入内存。 -
@TheParamagneticCroissant 这不会是最快的解决方案。最快的解决方案可能是
mmap。 -
@JamesKanze 可能最快的解决方案而不是猜测将是先完成它最简单的方法,检查性能是否可以接受,只有在不可以的情况下才想知道优化,最好使用分析器。
-
@BartoszKP 这当然是正确的方法;最后,您需要的不是最快的解决方案,而是足够快的解决方案。从经验来看,使用
mmap可以提高性能,在必要时并且正确地完成并不是很困难。但是当然,你应该只删除ifstream如果你显然有性能问题。 (这样做时,您应该验证是否是由于转换(某些实现不是很好)或数据通过放置;mmap仅对后者有帮助。)
标签: c++ performance c++11 input stream