为什么 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中文网其他相关文章!