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%.