Страница 1 из 1 |
CPP, как ускорить код?
Автор | Сообщение |
---|---|
|
0
Я недавно начал изучать C++, поэтому решил попробовать написать программку которая будет перебирать PID'ы и выдавать названия ассоциирующихся с ними процессов. В данном виде моя функция заработала, однако она думает слишком долго. Подскажите плиз, какие бывают способы ускорить такие вещи?
Код: String^ GetNameX() { Process^ pp; int i; String^ ss; for (i=0; i<=100500; i++) { try { pp = Process::GetProcessById(i); //пытаемся определить имя процесса ss = ss + "\n" + Convert::ToString(i) +"==" + Convert::ToString(pp); //определили, записываем в переменную } catch (Exception^ ee) { ; //хееееегакс процесса не существует, и похег } } return ss; } |
10 сен 2011, 22:11 |
|
|
Возможно так же как и в css\html. Уменьши размер файла с кодом. Убери все ненужные пробелы. Сделай все в одну строчку.
|
10 сен 2011, 22:20 |
|
|
0
количество пробелов не влияет т.к. компиляторы обычно их убирают автоматом
единственный вариант искать более быстрые алгоритмы, спец функции и тп |
10 сен 2011, 22:22 |
|
|
0
Код: #include #include #include #include // To ensure correct resolution of symbols, add Psapi.lib to TARGETLIBS // and compile with -DPSAPI_VERSION=1 void PrintProcessNameAndID( DWORD processID ) { TCHAR szProcessName[MAX_PATH] = TEXT(""); // Get a handle to the process. HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID ); // Get the process name. if (NULL != hProcess ) { HMODULE hMod; DWORD cbNeeded; if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), &cbNeeded) ) { GetModuleBaseName( hProcess, hMod, szProcessName, sizeof(szProcessName)/sizeof(TCHAR) ); } } // Print the process name and identifier. _tprintf( TEXT("%s (PID: %u)\n"), szProcessName, processID ); // Release the handle to the process. CloseHandle( hProcess ); } int main( void ) { // Get the list of process identifiers. DWORD aProcesses[1024], cbNeeded, cProcesses; unsigned int i; if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) ) { return 1; } // Calculate how many process identifiers were returned. cProcesses = cbNeeded / sizeof(DWORD); // Print the name and process identifier for each process. for ( i = 0; i < cProcesses; i++ ) { if( aProcesses[i] != 0 ) { PrintProcessNameAndID( aProcesses[i] ); } } return 0; } |
10 сен 2011, 22:37 |
|
|
0
Спасибо, DDUH, походу из-за "try catch" тормозит, реально извращение, попробую через if (NULL != hProcess ){ }, но надо будет про threading почитать, не особо представляю как вообще распарралеливать и как потом эти куски собирать обратно.
|
10 сен 2011, 22:57 |
|
|
0
Cespenar писал(а): Спасибо, DDUH, походу из-за "try catch" тормозит, реально извращение, попробую через if (NULL != hProcess ){ }, но надо будет про threading почитать, не особо представляю как вообще распарралеливать и как потом эти куски собирать обратно. Ты ничего не понял. for (i=0; i<=100500; i++) // - вместо того чтобы перебирать все процессы подряд, нужно вызвать системную функцию получения множества всех процессов - Эта функция вернёт тебе массив ID всех процессов, и пробегая по массиву получаешь имена. Ты же пытаешься 100500 раз вызывать Process::GetProcessById(i), хотя процессов в системе от силы 100. |
10 сен 2011, 23:03 |
|
|
0
про пробелы это понятно как день.
а вот можно по подробнее про EnumProcessModules эта процедура возвращает множество только активных процессов ? |
10 сен 2011, 23:08 |
|
|
0
Цитата: Ты ничего не понял. for (i=0; i<=100500; i++) // - вместо того чтобы перебирать все процессы подряд, нужно вызвать системную функцию получения множества всех процессов - EnumProcessModules Эта функция вернёт тебе массив ID всех процессов, и пробегая по массиву получаешь имена. Ты же пытаешься 100500 раз вызывать Process::GetProcessById(i), хотя процессов в системе от силы 100. Дада, уже въехал;) только похоже не массив ID, а просто левый массив процессов из которых я получаю ID, имя и еще что-нибудь. |
10 сен 2011, 23:18 |
|
|
0
Cespenar писал(а): Цитата: Ты ничего не понял. for (i=0; i<=100500; i++) // - вместо того чтобы перебирать все процессы подряд, нужно вызвать системную функцию получения множества всех процессов - EnumProcessModules Эта функция вернёт тебе массив ID всех процессов, и пробегая по массиву получаешь имена. Ты же пытаешься 100500 раз вызывать Process::GetProcessById(i), хотя процессов в системе от силы 100. Дада, уже въехал;) только похоже не массив ID, а просто левый массив процессов из которых я получаю ID, имя и еще что-нибудь. это назывется - запись +_+ |
10 сен 2011, 23:23 |
|
|
0
написать такое сообщение на игровом портале,это возможность показать какой ты?
пойду спрошу на форуме хирургов какого мясца мне купить к ужину |
11 сен 2011, 08:05 |
|
|
0
Floy писал(а): написать такое сообщение на игровом портале,это возможность показать какой ты? пойду спрошу на форуме хирургов какого мясца мне купить к ужину Человек просто спросил совета. Форум хоть и игровой, но тут есть специальные разделы для таких вопросов, что мешает ему спросить? Если у тебя не хватает мозгов написать что-то дельное, то лучше промолчи. |
11 сен 2011, 09:08 |
|
Страница 1 из 1 |