跳转至

关于文件 IO 的效率

测试 Ubuntu 和 Windows10 时使用的是同一台电脑,但 NOI Linux 用的是另一台。

输入

Ubuntu

\(2 \times 10^7\)int \(10^7\)double \(10^8\)char
cin \(3002 \text{ms}\) \(3181 \text{ms}\) \(1786 \text{ms}\)
cin 取消同步 \(921 \text{ms}\) \(1275 \text{ms}\) \(597 \text{ms}\)
cin 取消绑定 \(920 \text{ms}\) \(1278 \text{ms}\) \(449 \text{ms}\)
cin 取消同步、绑定 \(921 \text{ms}\) \(1267 \text{ms}\) \(449 \text{ms}\)
ifstream \(920 \text{ms}\) \(1261 \text{ms}\) \(470 \text{ms}\)
scanf \(840 \text{ms}\) \(921 \text{ms}\) \(1322 \text{ms}\)
getchar \(300 \text{ms}\) -- \(160 \text{ms}\)
ifstream::get \(651 \text{ms}\) -- \(366 \text{ms}\)

Windows 10

\(2 \times 10^6\)int \(10^6\)double \(2 \times 10^7\)char
cin \(2010 \text{ms}\) \(3497 \text{ms}\) \(1462 \text{ms}\)
cin 取消同步 \(311 \text{ms}\) \(2357 \text{ms}\) \(209 \text{ms}\)
cin 取消绑定 \(303 \text{ms}\) \(2359 \text{ms}\) \(160 \text{ms}\)
cin 取消同步、绑定 \(302 \text{ms}\) \(2352 \text{ms}\) \(164 \text{ms}\)
ifstream \(311 \text{ms}\) \(2340 \text{ms}\) \(163 \text{ms}\)
scanf \(836 \text{ms}\) \(819 \text{ms}\) \(1589 \text{ms}\)
getchar \(344 \text{ms}\) -- \(360 \text{ms}\)
ifstream::get \(151 \text{ms}\) -- \(141 \text{ms}\)

NOI Linux

\(5 \times 10^6\)int \(5 \times 10^6\)double \(4 \times 10^7\)char
cin \(2094 \text{ms}\) \(2878 \text{ms}\) \(1766 \text{ms}\)
cin 取消同步 \(621 \text{ms}\) \(1240 \text{ms}\) \(694 \text{ms}\)
cin 取消绑定 \(552 \text{ms}\) \(1221 \text{ms}\) \(534 \text{ms}\)
cin 取消同步、绑定 \(532 \text{ms}\) \(1212 \text{ms}\) \(549 \text{ms}\)
ifstream \(552 \text{ms}\) \(1231 \text{ms}\) \(514 \text{ms}\)
scanf \(642 \text{ms}\) \(914 \text{ms}\) \(1372 \text{ms}\)
getchar \(243 \text{ms}\) -- \(168 \text{ms}\)
ifstream::get \(470 \text{ms}\) -- \(357 \text{ms}\)

输出

Ubuntu

\(5 \times 10^6\)int \(2 \times 10^6\)double \(5 \times 10^6\)char
cout(endl) \(3892 \text{ms}\) \(2227 \text{ms}\) \(3767 \text{ms}\)
cout('\n') \(211 \text{ms}\) \(566 \text{ms}\) \(121 \text{ms}\)
cout(endl) 取消同步 \(3905 \text{ms}\) \(2201 \text{ms}\) \(3651 \text{ms}\)
cout('\n') 取消同步 \(196 \text{ms}\) \(544 \text{ms}\) \(97 \text{ms}\)
ofstream(endl) \(3850 \text{ms}\) \(2168 \text{ms}\) \(3642 \text{ms}\)
ofstream('\n') \(185 \text{ms}\) \(548 \text{ms}\) \(95 \text{ms}\)
printf \(199 \text{ms}\) \(655 \text{ms}\) \(101 \text{ms}\)
putchar \(145 \text{ms}\) -- \(21 \text{ms}\)
ofstream::put \(270 \text{ms}\) -- \(45 \text{ms}\)
\(2 \times 10^7\)int \(5 \times 10^6\)double \(5 \times 10^7\)char
cout('\n') \(832 \text{ms}\) \(1409 \text{ms}\) \(1210 \text{ms}\)
cout('\n') 取消同步 \(764 \text{ms}\) \(1360 \text{ms}\) \(984 \text{ms}\)
ofstream('\n') \(738 \text{ms}\) \(1647 \text{ms}\) \(931 \text{ms}\)
printf \(791 \text{ms}\) \(1592 \text{ms}\) \(982 \text{ms}\)
putchar \(578 \text{ms}\) -- \(195 \text{ms}\)
ofstream::put \(1017 \text{ms}\) -- \(434 \text{ms}\)

Windows10

\(10^6\)int \(5 \times 10^5\)double \(2 \times 10^6\)char
cout(endl) \(2869 \text{ms}\) \(1946 \text{ms}\) \(5513 \text{ms}\)
cout('\n') \(100 \text{ms}\) \(376 \text{ms}\) \(99 \text{ms}\)
cout(endl) 取消同步 \(2796 \text{ms}\) \(1895 \text{ms}\) \(5418 \text{ms}\)
cout('\n') 取消同步 \(178 \text{ms}\) \(443 \text{ms}\) \(98 \text{ms}\)
ofstream(endl) \(2781 \text{ms}\) \(1893 \text{ms}\) \(5648 \text{ms}\)
ofstream('\n') \(166 \text{ms}\) \(440 \text{ms}\) \(103 \text{ms}\)
printf \(209 \text{ms}\) \(455 \text{ms}\) \(138 \text{ms}\)
putchar \(202 \text{ms}\) -- \(88 \text{ms}\)
ofstream::put \(125 \text{ms}\) -- \(62 \text{ms}\)
\(5 \times 10^6\)int \(10^6\)double \(10^7\)char
cout('\n') \(439 \text{ms}\) \(752 \text{ms}\) \(475 \text{ms}\)
cout('\n') 取消同步 \(874 \text{ms}\) \(904 \text{ms}\) \(493 \text{ms}\)
ofstream('\n') \(841 \text{ms}\) \(895 \text{ms}\) \(547 \text{ms}\)
printf \(997 \text{ms}\) \(922 \text{ms}\) \(695 \text{ms}\)
putchar \(963 \text{ms}\) -- \(424 \text{ms}\)
ofstream::put \(600 \text{ms}\) -- \(226 \text{ms}\)

NOI Linux

\(2 \times 10^6\)int \(10^6\)double \(4 \times 10^6\)char
cout(endl) \(5912 \text{ms}\) \(4363 \text{ms}\) \(11246 \text{ms}\)
cout('\n') \(323 \text{ms}\) \(830 \text{ms}\) \(254 \text{ms}\)
cout(endl) 取消同步 \(5872 \text{ms}\) \(4401 \text{ms}\) \(11056 \text{ms}\)
cout('\n') 取消同步 \(194 \text{ms}\) \(841 \text{ms}\) \(192 \text{ms}\)
ofstream(endl) \(5729 \text{ms}\) \(4308 \text{ms}\) \(11054 \text{ms}\)
ofstream('\n') \(200 \text{ms}\) \(823 \text{ms}\) \(190 \text{ms}\)
printf \(237 \text{ms}\) \(1217 \text{ms}\) \(227 \text{ms}\)
putchar \(184 \text{ms}\) -- \(58 \text{ms}\)
ofstream::put \(268 \text{ms}\) -- \(86 \text{ms}\)
\(10^7\)int \(2 \times 10^6\)double \(2 \times 10^7\)char
cout('\n') \(1254 \text{ms}\) \(1680 \text{ms}\) \(1249 \text{ms}\)
cout('\n') 取消同步 \(1011 \text{ms}\) \(1647 \text{ms}\) \(961 \text{ms}\)
ofstream('\n') \(1016 \text{ms}\) \(1649 \text{ms}\) \(965 \text{ms}\)
printf \(1197 \text{ms}\) \(2415 \text{ms}\) \(1132 \text{ms}\)
putchar \(963 \text{ms}\) -- \(273 \text{ms}\)
ofstream::put \(1344 \text{ms}\) -- \(424 \text{ms}\)

结论

  • Ubuntu 和 NOI Linux 的测试结果差不多 毕竟 NOI Linux 就是魔改的 Ubuntu,而 Windows10 的测试结果看起来很玄学。
  • cin/cout 最好取消同步和绑定。
  • 文件 IO 用 freopen+cin/coutifstream/ofstream 均可。
  • 如果想要更快的 IO,可以使用 getchar/putchar