Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Ottimizzazione del codice
Forum - C/C++ - Ottimizzazione del codice

Avatar
jerry74 (Normal User)
Newbie


Messaggi: 15
Iscritto: 01/02/2009

Segnala al moderatore
Postato alle 21:42
Mercoledì, 20/10/2010
Sera a tutti, nel creare una piccola applicazione ho avuto la necessità di avviare un file exe; dopo diverse ricerche ho creato il seguente codice che funziona correttamente:

Codice sorgente - presumibilmente Delphi

  1. // acquisisco il percorso di esecuzione del file
  2.     TCHAR *tchar_string = (argv[0]);
  3.     // lo trasformo in una wstring
  4.     std::wstring path (tchar_string);
  5.     //elimino la parte relativa al nome del file ed estensione
  6.     path = path.substr(0, path.rfind('\\'));
  7.     // converto il percorso in const wchar_t
  8.     const wchar_t* tpath = path.c_str();
  9.     // converto in wchar_t
  10.     wchar_t* __tpath = new wchar_t[0xFF];
  11.     wcscpy_s(__tpath, 200, tpath);
  12.     // acquisisco cartella e nome file da avviare
  13.     wchar_t* __file__ = TEXT("\\fw40\\setup.exe");
  14.     // Creo il percorso completo
  15.     std::wcscat(__tpath, __file__);
  16.     // Avvio il programma
  17.     ShellExecuteW(NULL,TEXT("open"),__tpath,NULL,NULL,SW_SHOWNORMAL);



Per puro scopo didattico, questo codice è già ottimale oppure si può migliorare?
Mi sembra che ci siano troppe conversioni tra tipi o sbaglio?

PM
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Up
0
Down
V
Segnala al moderatore
Postato alle 4:19
Venerdì, 22/10/2010

ma se è un file exe, che senso ha passare per la shellexecute?
molto meglio usare direttamente CreateProcess: http://msdn.microsoft.com/en-us/library/ms682425(v=VS.85). ...

PM
Avatar
jerry74 (Normal User)
Newbie


Messaggi: 15
Iscritto: 01/02/2009

Up
0
Down
V
Segnala al moderatore
Postato alle 10:07
Venerdì, 22/10/2010
All'inizio pensavo di usare System("comando") ma l'ho subito scartato ed ho visto che si può avviare un file exe con shellexecute. In CreateProcess non mi ero ancora imbattuto. Stasera provo e vedo come funziona.
Se non ho capito male shellexecute apre una shell nella quale esegue il file che gli passo come parametro mentre CreateProcess avvia direttamente uil file come un processo. Avviando direttamente il processo occupa meno risorse, è per questo che è consigliabile usarlo?

PM
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Up
0
Down
V
Segnala al moderatore
Postato alle 13:14
Venerdì, 22/10/2010
Testo quotato

Postato originariamente da jerry74:

All'inizio pensavo di usare System("comando") ma l'ho subito scartato ed ho visto che si può avviare un file exe con shellexecute. In CreateProcess non mi ero ancora imbattuto. Stasera provo e vedo come funziona.
Se non ho capito male shellexecute apre una shell nella quale esegue il file che gli passo come parametro mentre CreateProcess avvia direttamente uil file come un processo. Avviando direttamente il processo occupa meno risorse, è per questo che è consigliabile usarlo?



credo che sia un'ottimizzazione abbastanza inutile, ad ogni modo la shellexecute è in grado di lanciare qualsiasi tipo di file, richiamando il loader opportuno. Ad esempio, se gli passi un documento word lei lancerà word in apertura di quel file, questo comporta uno scan dell'estensione e diversi accessi al registro per capire cosa fare con quel determinato tipo di file.
La CreateProcess invece è in grado di caricare in memoria solo file eseguibili (exe), quindi risparmi diversi passaggi interni.
Nonostante tutto questo non noterai MAI la differenza di tempo per l'apertura, al limite utilizzando funzioni come GetTickCount o i performance counters riusciresti a registrare il miglioramento, anche se di qualche millisecondo.

PM
Avatar
jerry74 (Normal User)
Newbie


Messaggi: 15
Iscritto: 01/02/2009

Up
0
Down
V
Segnala al moderatore
Postato alle 22:38
Venerdì, 22/10/2010
Testo quotato

Postato originariamente da HeDo:

Ad esempio, se gli passi un documento word lei lancerà word in apertura di quel file, questo comporta uno scan dell'estensione e diversi accessi al registro per capire cosa fare con quel determinato tipo di file.



Questa è una cosa che non conoscevo e che può tornare utile in futuro. Nel caso specifico, userò CreateProcess perchè devo solo avviare file exe.

Ma le diverse conversioni di tipo presenti nel codice non hanno impatto sulle prestazioni?  

PM