2010-08-21 2 views
4

Я запускаю процесс и записываю XML-файл целой последовательности в процесс назначения через stdin. Существует всего 2 тыс. Данных, но для передачи большого количества данных требуется почти полсекунды, что для меня слишком много. То, что я измеряю, - это время, затрачиваемое дочерним процессом на использование данных.C# StdIn/StdOut Performance

Любые предложения относительно того, как ускорить это?

процесс Родитель:

ProcessStartInfo psi = new ProcessStartInfo(path, args); 
    psi.CreateNoWindow = true; 
    psi.UseShellExecute = false; 
    psi.RedirectStandardInput = true; 
    Process p = Process.Start(psi); 
    p.StandardInput.Write(stdin); 
    p.StandardInput.Close(); 

Детский процесс:

Stream s = Console.OpenStandardInput(); 
    StreamReader sr = new StreamReader(s); 
    return sr.ReadToEnd(); 

Для записи, я сделал попробовать одно изменение, где я написал длину данных первого и прочитать, что точное количество байтов назад, чтобы избежать ожидания закрытия потока, но это никак не повлияло на производительность.

Я рождаю много маленьких рабочих процессов, поэтому дополнительные 0,5 секунды на одного работника убивают меня!

Редактировать: Я ценю все комментарии, но я специально ищу любой способ улучшить производительность stdin. В .5s я уже упоминал, что измеряется вокруг кода дочернего процесса:

Stopwatch sw = new Stopwatch(); 
    sw.Reset(); 
    sw.Start(); 
    string stdin = ReadStdIn(); 
    sw.Stop(); 
    Console.WriteLine("Elapsed time to read stdin: " + sw.ElapsedMilliseconds); 

второй Edit: В этом случае, нерестовые потоки не возможность. По причинам, выходящим за рамки этого вопроса, мне нужно, чтобы каждая работа имела собственное пространство памяти (ограничено 32 бит 2 гб).

+1

Вместо этого создайте небольшие рабочие потоки. –

+1

Истериться больше зерлингов. – user318747

ответ

1

Вы пытались сделать то же самое, кроме того, что не читали/не записывали данные? То есть. измерение времени, которое требуется для запуска родительской программы для ребенка, подготовить его к запуску, запуску и завершению?

Поскольку ваш «детский» код также похож на C#, это может быть накладные расходы на загрузку дочерних exe + библиотек, запуск среды .NET и т. Д., Которые берут 0,5 с, а не на запись и чтение ваших данных ,

Это говорит о том, что запуск новых процессов на окнах не является дешевым (по крайней мере, не так, как в большинстве вариантов * nix). Вы можете посмотреть на использование потоков вместо процессов, если вы беспокоитесь о сроках здесь.

+0

Спасибо за комментарии, но я измерял в дочернем процессе (как только он уже был запущен). Я измерял время, затраченное на чтение данных из stdin. –

0

Может случиться так, что запуск дочерних процессов занимает так много времени, а не чтение из stdin. Помните, что CIL должен каждый раз зажиматься.

Если это так, рассмотрите возможность запуска ngen install на EXE, который вы нерест. Это значительно улучшит время запуска, в основном, JIT для ребенка EXE после и не каждый раз, когда вы его запускаете.

+0

ngen поможет с временем запуска немного, но запуск процесса и время запуска .net все еще могут быть больше, чем вы можете иметь дело. –

+0

@ Джонатан: Я рекомендую оставить его до OP, чтобы попробовать решение и решить, достаточно ли он * для своих целей *. – Timwi

+0

ngen может помочь в общем, но для моего конкретного случая я измеряю время, когда дочерний процесс действительно читается в stdin, а не в момент запуска. –