У меня есть следующая функция для извлечения информации о процессе в DataTable:
public DataTable getProcesses()
{
DataTable dt = new DataTable();
dt.Columns.Add("ID");
dt.Columns.Add("Name");
dt.Columns.Add("Path");
dt.Columns.Add("User");
dt.Columns.Add("Priority");
string pid = "-";
string name = "-";
string path = "-";
string priort = "-";
string user = "-";
string query = "Select * From Win32_Process";
ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
ManagementObjectCollection processList = searcher.Get();
foreach (ManagementObject proc in processList)
{
pid = proc["ProcessID"].ToString();
name = proc["Name"].ToString();
if (proc["ExecutablePath"] != null)
{
path = proc["ExecutablePath"].ToString();
priort = proc["Priority"].ToString();
}
string[] argList = new string[2];
int returnVal = Convert.ToInt32(proc.InvokeMethod("GetOwner", argList));
if (returnVal == 0)
{
// return DOMAIN\user
user = argList[1] + "\\" + argList[0];
}
dt.Rows.Add(pid, name, path, user, priort);
}
return dt;
}
В конечном итоге это работает и дает мне желаемый результат, но для его выполнения требуется 20-30 секунд.
Мне было интересно, есть ли способ оптимизировать функцию или конкретный запрос, который, скорее всего, является источником "задержки".
edit
После выполнения некоторых действий, предложенных в комментариях, оно сократилось в среднем до 15-20 секунд, но это все еще слишком долго.Максимум, 4-5 секунд будет терпимо.Я до сих пор не изменил запрос, могу ли я что-нибудь сделать, чтобы он был быстрее?
edit 2
После применения некоторых изменений, предложенных @NicoRiffи, продолжая получать то же время выполнения, я провел некоторую отладку, чтобы увидеть, что эффективно занимает так много времени.Оказывается, это одна конкретная строка: int returnVal = Convert.ToInt32(proc.InvokeMethod("GetOwner", argList));
, которая даст мне пользователя, который «владеет» каждым процессом.
Эта строка занимает около 60 мс, в то время как все остальные занимают 1-2 мс.Более 200 итераций (это количество процессов, которые у меня есть, я могу только представить себе, сколько времени потребуется для большого списка), это занимает около 12-13 секунд (только для этой одной строки), давая 15-20итого.
Теперь, когда я "выделил" проблему, как я могу оптимизировать эту функцию?