首页 >后端开发 >C++ >为什么 C 的 cin 从 stdin 读取行明显慢于 Python?

为什么 C 的 cin 从 stdin 读取行明显慢于 Python?

DDD
DDD原创
2024-12-29 11:53:10787浏览

Why is C  's `cin` Significantly Slower Than Python for Reading Lines from stdin?

为什么 C 语言中从 stdin 读取行比 Python 慢得多?

背景:

使用 C 从 stdin 读取字符串输入行可能比 Python 等效项慢得多。出现这种差异的原因是 C 中的默认设置需要更多系统调用。

输入流的默认行为:

默认情况下,C 输入流 cin 与标准 C I/O 库 (stdio)。这种同步确保输入不会被缓冲并且一次读取一个字符。虽然此行为可以防止 cin 流和 stdio 函数之间的冲突,但也会带来性能损失。

系统调用的使用:

当 cin 与 stdio 同步时,每个读取的字符都会触发系统调用,这是一个代价高昂的操作。这一开销会显着减慢输入过程,尤其是在读取大量数据时。

解决方案:

要提高 C 中行读取的性能,可以禁用cin 和 stdio 之间的同步。这可以通过调用sync_with_stdio(false)方法来实现。

或者,使用 fgets 函数而不是 getline 也可以绕过同步开销。

性能比较:

这是原始(同步)C 实现与各种实现之间的性能比较方法:

Implementation Lines per Second
Python (default) 3,571,428
cin (default/naive) 819,672
cin (no sync) 12,500,000
fgets 14,285,714
wc (not a fair comparison) 54,644,808

结论:

禁用 cin 和 stdio 之间的同步或使用 fgets 可以显着提高 C 中行读取的性能,使其与Python 的效率。

以上是为什么 C 的 cin 从 stdin 读取行明显慢于 Python?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn