Il programma di calcolo non funziona al 100% di utilizzo della CPU

2

Ho un programma che ha una GUI ed esegue calcoli matematici molto pesanti per un paio di minuti e poi emette un risultato. Quando provo a interfacciarlo direttamente tramite le sue DLL, funziona bene, ma non funziona al 100% di CPU come la GUI. Perché è questo?

Comprendo il motivo per cui il programma pesante computazionale potrebbe non funzionare al 100% è dovuto all'I / O che potrebbe essere eseguito, ma questo programma non ne fa alcuno, nemmeno un singolo printf (). I file vengono generati alla fine dell'esecuzione in entrambe le versioni GUI e DLL del programma. Il programma di interfaccia effettua anche più chiamate alla DLL durante l'esecuzione.

È scritto in C, compilato usando il compilatore VS2008 CL in esecuzione in modalità Release. Funzionante su CPU Intel i5 con 4 GB di RAM (media di utilizzo del 60%, mai superiore al 70%). Quando ho impostato l'affinità con il processo su una CPU (in questo caso, 1/4 "CPU", 2 core con 2 thread ciascuno), la GUI utilizza il 100% di quella CPU dedicata per circa 2 minuti. La mia applicazione di interfacciamento utilizza ovunque dal 60% all'80% della CPU per circa 5 minuti. Uso la scheda Performance di Windows quando eseguo CTRL + SHFT + ESC .

--- EDIT ---

Ho scoperto che le chiamate al database (ce ne sono alcune specifiche) vengono anticipate molto per lunghi periodi di tempo (di solito 5 volte più lenti). Utilizzando Process Explorer ho potuto scoprire che ogni programma utilizza esattamente la stessa quantità di tempo CPU - > portando alla mia conclusione sulla prelazione. Per tutti coloro che non conoscono questo strumento, scarica Process Explorer da SysInternals, molto utile.

--- EDIT ---

Ho scoperto che la GUI apre una singola connessione statica al database. Mentre la mia interfaccia non lo fa, porta ad aprire e chiudere la connessione migliaia di volte. L'apertura una volta per tutta la vita ha portato la CPU al 100%.

    
posta jn1kk 05.01.2012 - 17:01
fonte

4 risposte

14

Crea un profilo!

È l'unico modo per sapere esattamente cosa sta accadendo e cosa sta usando quali risorse e dove è limitato.

    
risposta data 05.01.2012 - 17:35
fonte
2

Ricorda che il tuo programma non è l'unico eseguito dal sistema operativo. Ad ogni programma è assegnata una priorità. Devi verificarlo e vedere se puoi dare al tuo programma una priorità più alta o ridurre le altre priorità dei programmi in esecuzione quando possibile.

    
risposta data 10.01.2012 - 23:01
fonte
1

Molte cose potrebbero causare questo. Una possibilità è che ci sia qualche logica di desincronizzazione coinvolta nel chiamare la DLL e ricevere risultati da essa, e questa logica da qualche parte rinuncia a un timeslice. ( Sleep(0) non rinuncerà al resto del tuo timeslice; Sleep(1) lo farà.)

Se per caso si sta usando una quantità eccessiva di memoria, potrebbe esserci qualche scambio in corso; ciò rallenterebbe molto MOLTO. Prova a disabilitare il file di scambio e verifica se si verifica un errore di memoria insufficiente. Io uso WinXP con 4 GB di RAM e nessun file di scambio, e la mia macchina è VELOCE! (Anche se corro il rischio di rimanere senza memoria, ma ne tengo traccia.)

E, ovviamente, vale la pena controllare la possibilità che stia scrivendo su un file mentre funziona. Potrebbe essere che come sta pensando, sta scrivendo i suoi pensieri in un file di registro?

Inoltre, anziché utilizzare il Task Manager di Windows per esaminare l'utilizzo della CPU, fai un favore a te stesso e ottieni Process Explorer di SysInternals . È molto, molto meglio, e ti darà molte più informazioni sui tuoi processi, le tue DLL, i manici che sono aperti, ecc.

    
risposta data 05.01.2012 - 17:41
fonte
0

A seconda di cosa stai facendo, il massimo della CPU non è il modo migliore e quindi, i numeri che stai recuperando ora potrebbero effettivamente significare che le cose girano più velocemente di prima, anche se il processore non è al massimo . Anche gli algoritmi estremamente complicati potrebbero non massimizzare l'utilizzo della CPU e questo può essere una buona cosa in quanto significa che puoi svolgere altre attività durante l'esecuzione del programma.

Ricorda che quando un programma è in esecuzione non tutti i dati possono essere nella cache del processore e il tempo necessario per uscire nella RAM (a corto dal punto di vista del processore) o in altro spazio (ad es. disco rigido, NAS, ecc.) (a lungo dal punto di vista del processore) è il momento in cui il processore può eseguire altre attività. I computer sono molto bravi nel cambio di attività e generalmente lo usiamo anche a nostro vantaggio.

In termini di programma, fare qualcosa con una GUI tende ad essere molto lento poiché la GUI deve aspettare che lo schermo venga ridisegnato quando gli aggiornamenti sono fatti e questo può richiedere un tempo estremamente lungo per essere eseguito dal punto di vista del processore. La maggior parte delle operazioni computazionalmente pesanti sono scritte in modo tale da essere disaccoppiate da una GUI per garantire che si focalizzino esclusivamente sulla loro attività e altri trucchi siano utilizzati per riportare il loro stato se richiedono un po 'di tempo per essere eseguiti.

In termini di rendere il tuo codice il più veloce possibile, come notato da Malfist nella loro risposta la profilazione del codice è la tua migliore scommessa e vedere cosa sta rallentando. Allo stesso modo, se possibile fare in modo che l'algoritmo esegua alcune parti in parallelo, si accerti che sia soggettivamente più veloce in quanto può trarre vantaggio da più core sul processore. Inoltre, è possibile scrivere alcune registrazioni di base che annotano quando alcune parti del codice sono inserite e chiuse (mostrando il tempo di esecuzione) e quante volte vengono eseguite determinate operazioni. Questi sono tipicamente dati in un buon profiler, ma può essere un esercizio utile da fare anche da solo.

    
risposta data 05.01.2012 - 18:09
fonte

Leggi altre domande sui tag