What is most efficient way to read a file of integer in each line without opening it?
在不打开整数文件的情况下,读取每行整数文件的最有效方法是什么?我有一个文件,每行只有整数,即:num.txt
在我的程序中,我使用while循环来读取它;
1 2 3 4 5
| int input = 0;
while(cin >> input)
{
// Assignment
} |
我使用time a.out 在Linux中读取它事实证明,读取1亿个数字大约需要15秒(用户时间)。所以我想知道有没有更好的方法来减少用户时间?
提前谢谢!
- 如果你关心性能,就不要使用iostreams。
- 给你:stackoverflow.com/questions/9371238/…
- 只是为了避免技术上的误导,当使用重定向"<"并将文件附加到文件描述符0或stdin时,实际上是使用shell打开文件。如果您希望对操作系统与文件的交互方式进行低级控制,请使用裸操作系统调用open(2)和read(2)。
- @TUX3:我们已经多次证明iostreams与其他读取文件的方法几乎完全相同。唯一有重大区别的是,是否可以将文件直接映射到内存中。(如果你是通过stdin喂它的话,这种方法是行不通的)-你可能需要转向sync_with_stdio来达到合理的性能。
- @Matspetersson我相信很容易找到很多其他缓慢的文件读取方法。我想说的是,默认情况下,iostreams没有很好的性能。
- @TUX3如果您关心性能,您建议什么作为替代方案?
- @TUX3:不,如果禁用sync_with_stdio,至少在Linux上,并在编译器中启用优化,iostream的速度与使用fread或read读取大的时间块以及使用strtol或类似工具解析整数的速度一样快。
- @QDII Shauryachats的回答在我看来很好,简单而且相当快。
- @我同意。也许我表达得不太好。
- 这里有一个关于fstream的速度的讨论(在本讨论中与iostream相同):stackoverflow.com/questions/26095160/&hellip;另一个讨论:stackoverflow.com/questions/15115943/&hellip;
- 我把这称为我刚才发布的第二个的副本。
1 2 3 4 5 6 7
| int input = 0;
ios_base::sync_with_stdio(false);
//Add this statement and see the magic!
while(cin >> input)
{
// Assignment
} |
使之极快(不推荐用于作业!),使用getchar_unlocked():
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| int read_int() {
char c = getchar_unlocked();
while(c<'0' || c>'9') c = gc();
int ret = 0;
while(c>='0' && c<='9') {
ret = 10 * ret + c - 48;
c = getchar_unlocked();
}
return ret;
}
int input = 0;
while((input = read_int()) != EOF)
{
// Assignment
} |
沃恩·卡托的回答很好地解释了这一点。
- 难以置信!程序在2.5秒内完成。你能简单解释一下你的魔法代码的含义吗?
- 如果你能解释一下停用sync_with_stdio会带来什么样的危险,以及为什么它会被默认打开,那就太棒了。
- 当然,桥东和@qdii我会再补充一点。
- @我不知道如果有效,请接受我的回答。