加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 快速阅读控制台输入

发布时间:2020-12-15 06:45:22 所属栏目:百科 来源:网络整理
导读:我需要从控制台的标准输入流快速读取数据.输入包括100.000行,每行20个字符(2百万个字符);用户将其从剪贴板粘贴.我的程序工作了大约3分钟(很慢,目标是10秒).看起来像: var inputData = new string[100000]; // 100.000 rows with 20 charsfor (int i = 0; i
我需要从控制台的标准输入流快速读取数据.输入包括100.000行,每行20个字符(2百万个字符);用户将其从剪贴板粘贴.我的程序工作了大约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...

我试过了什么

> Directly:Console.Read,Console.ReadKey – 相同的结果
> Console.In:Read(),ReadLine(),ReadAsync(),ReadLineAsync(),ReadBlock(具有各种块大小),ReadBlockAsync(),ReadToEnd(),ReadToEndAsync() – 相同的结果
>新的StreamReader(Console.OpenStandardInput(缓冲区)),具有各种缓冲区和块大小 – 相同的结果
>在阅读开始时隐藏控制台窗口,并在阅读完成后显示 – 加速度10%
>我尝试从文件获取输入数据 – 它的工作是完美和快速的.但是我需要从__ConsoleStream中读取.

我注意到,输入正在读取中 – 进程conhost.exe主动使用一个处理器.

如何加快输入的阅读速度?

UPD:

>增加/减少Console.BufferHeight和Console.BufferWidth没有影响
ReadFile msdn也慢慢.但是我注意到一个有趣的事实:

ReadFile(handle,buffer,bufferSize,out bytesCount,null);
// bufferSize may be very big,but buffer obtains no more than one row (with rn).
// So,it seems that data passed into InputStream row-by-row syncroniously.

解决方法

使用本机WinApi函数:

>获取输入句柄:GetStdHandle msdn
>使用ReadFile(而不是ReadLine)读取22字节(带endline / n / r)msdn

WinApi在C#中使用的示例:http://www.pinvoke.net/

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读