Мне нужно для быстрого чтения данных из стандартного потока ввода консоли. Вход состоит из 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...
Что я пробовал:
-
Непосредственно: Console.Read, Console.ReadKey - тот же результат
-
Console.In: Read(), ReadLine(), ReadAsync(), ReadLineAsync(), ReadBlock (с различным размером блока), ReadBlockAsync(), ReadToEnd(), ReadToEndAsync() - тот же результат
-
новый StreamReader (Console.OpenStandardInput(buffer)) с различным размером буфера и блока - тот же результат
-
Скрыть окно консоли в начале чтения и показать его при завершении чтения - ускорение 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 \r\n). // So, it seems that data passed into InputStream row-by-row syncroniously.