C#中控制台I / O的更快方式

时间:2014-07-07 21:41:04

标签: c# io console

我最近开始在编程竞赛网站上使用C#,如球体在线评判。我注意到的一件事是,控制台I / O可以真正减慢我在C#中的程序。

我主要使用Console.ReadLine和Console.WriteLine方法。对于整数解析,我编写了自己的解析器,因为内置的解析器是quite slow

我知道,写入控制台的速度很慢,所以当有很多东西需要编写时,我会使用StringBuilder来构建所有输出,并使用一个Console.WriteLine(sb.ToString( ))打电话。

我还有什么可以加强I / O的优化吗?除了我上面提到的,还有其他I / O方式吗?

(请备用 you-should-check-your-algorithm-first 类型的回复,这个问题专门针对快速I / O.感谢您的理解。)

1 个答案:

答案 0 :(得分:0)

这里是 GIST。

读取字符串并将其转换回整数或长整型等会产生不必要的开销。

需要考虑的事情:

  1. 您能一次性阅读多个测试用例吗?
  2. 您能否以受支持且更容易转换为其他数据类型的格式读取输入? [字符串对开发人员来说很简单;)]
  3. 你能以缓冲的方式阅读吗?
  4. SPOJ C# 编译器是否支持不安全代码?那么你可以节省更多的滴答声吗?等等...,

这是我对 INOUT 测试的看法

您应该使用一个巨大的缓冲区 (byte[]) 并将所有控制台输入读取为字节 - 然后使用 ReadByte() 循环遍历该缓冲区,直到您看到一个空白字符并根据您的输入将该段转换为整数或长或字符串格式。

非常有效,并且为时间限制严格的问题节省了大量时间。

这是我的示例代码

public int ReadInt()
    {
        byte readByte;
        while ((readByte = GetByte()) < '-') ;

        var neg = false;
        if (readByte == '-')
        {
            neg = true;
            readByte = GetByte();
        }
        var m = readByte - '0';
        while (true)
        {
            readByte = GetByte();
            if (readByte < '0') break;
            m = m * 10 + (readByte - '0');
        }
        return neg ? -m : m;
    }

这是我在 SPOJ 中使用的代码 https://github.com/davidsekar/C-sharp-Programming-IO/blob/master/ConsoleInOut/InputOutput.cs

谢谢,

davidsekar