Console类的读写速度真是不忍直视啊。。
事情要从一道Codeforces上的题目说起,我自认为代码实现没有问题,但一直在第6个点上TLE,于是我想到是读取太慢了。
我当时是写了一个对于各种类型都通用的泛型方法:逐行读进来并按空格分隔,然后(T)Convert.ChangeType(item, typeof(T))。item是分隔后的各个字符串,T是要转成的类型。
这显然是在作死。
先不考虑Console类的速度,单是object类型的参数和返回值造成的装/拆箱就严重拖慢了速度。而且BCL中的类型转换方法因为要考虑各种情况,也会影响速度。
因为从Console读进来的内容大多只有数字和字符串,我决定不再作死,写一个OI中常用的快速读入函数。
这回好了一些,但还是在第30个点TLE了。
参考了一下某神犇的程序,发现可以通过手动指定缓冲区大小来提速。
这是最终版的程序。
把Console的读写重定向到一个流的时候可以指定缓冲区的大小,这回总算是AC了,速度还要比被参考的那位神犇的程序快1/2。
要注意的一点是Main方法结尾一定要调用writer.Flush()把缓冲区的内容都写入流。