在spoj上做The Shortest Path,不断的TLE,郁闷之极,又找不到测试数据。
无奈之下求助google,结果发现spoj网站论坛的一个帖子《Read this before posting!》里面说:
Check your input/output methods. In C++, using cin and cout is too slow. Use these, and you will guarantee not being able to solve any problem with a decent amount of input or output. Use printf and scanf instead. In java, a Scanner is even worse. Using a BufferedReader is your best bet for most problems. If you code in other languages, check the specific language forum to see if you can find any pointers there.
联想起题目中的提示“Warning: large Input/Output data, be careful with certain languages”,难道是……我中招了?赶紧动手把cin, cout请出去,把scanf, printf请进来。运行结果:
cin,cout的版本6.7秒
换成scanf,printf:3.2秒
再提交,通过。我就凌乱了啊。
困扰了几个月的程序性能问题,竟然只是因为C++的std::cin和std::cout。
iostream你用不用慢成这样啊?
两个教训:
第一,不管干什么,说明一定要细读,磨刀不误砍柴工;
第二,慎用C++的iostream...
(这道题的best solutions前20名有19个是C/C++实现。后来又看到有人在说,他用C++写的代码运行了11秒多,用C#直接超过25秒。我在想,我们学算法和数据结构的时候反复强调,问题规模够大以后,渐进复杂度会淹没其他一切因素,最终决定一个程序的性能;但我们是不是过分地强调了这一点?这容易让我们自己忘记一个事实:在同等的渐进复杂度下,尤其是完全相同的算法和数据结构下,不同语言的性能差距还是很大的。)
阅读(461) | 评论(0) | 转发(0) |