【发布时间】:2015-10-26 09:28:40
【问题描述】:
我需要从控制台的标准输入流快速读取数据。输入由 100.000 行组成,每行 20 个字符(200 万个字符);用户从剪贴板粘贴它。我的程序运行大约 3 分钟(非常 很慢;目标是 10 秒)。它看起来像:
var inputData = new string[100000]; // 100.000 rows with 20 chars
for (int i = 0; i < 100000; i++) // Cycle duration is about 3 minutes...
{
inputData[i] = Console.ReadLine();
}
// some processing...
我尝试了什么:
直接:Console.Read,Console.ReadKey——结果相同
Console.In:Read()、ReadLine()、ReadAsync()、ReadLineAsync()、ReadBlock(具有各种块大小)、ReadBlockAsync( )、ReadToEnd()、ReadToEndAsync() - 结果相同
具有不同缓冲区和块大小的新 StreamReader(Console.OpenStandardInput(buffer))- 结果相同
开始阅读时隐藏控制台窗口,阅读结束时显示- 加速 10%
我尝试从文件中获取输入数据 - 它运行完美且快速。但我需要阅读 __ConsoleStream。
我注意到,在输入读取过程中 - 进程 conhost.exe 主动使用处理器。
如何加快输入的读取速度?
更新:
增加/减少 Console.BufferHeight 和 Console.BufferWidth 无效
-
ReadFilemsdn也慢。但我注意到一个有趣的事实:ReadFile(handle, buffer, bufferSize, out bytesCount, null); // bufferSize may be very big, but buffer obtains no more than one row (with \r\n). // So, it seems that data passed into InputStream row-by-row syncroniously.
【问题讨论】:
-
inputData = Console.ReadLine();无法编译,剪贴板究竟如何适应? -
阅读 20 MB 的文本需要不到一秒钟的时间。
-
为什么不直接从剪贴板读取数据呢? stackoverflow.com/questions/3840080/…
-
不知道玩BufferHeight会不会有什么改变。
-
@HenkHolterman,对不起,必须是
inputData[i] = Console.ReadLine();
标签: c# .net input stream console