La chiamata di sistema stat()
è davvero costosa? Ho letto da qualche parte che è una chiamata di sistema costosa da usare. É davvero? Se è così ci sono altre alternative?Stat() è una chiamata di sistema costosa?
risposta
In un'impostazione tipica, stat(2)
, fstat(2)
e lstat(2)
sono le uniche tecniche sane per ottenere informazioni sui file. Se si riscontrano problemi di prestazioni, sarebbe utile profilare la propria applicazione e vedere cosa succede.
Per il profilo, compilare con gcc -pg
ed eseguire l'eseguibile con gprof(1)
.
Potresti, potenzialmente, passare a utilizzare una libreria più grande come Qt, ma probabilmente non gestirà alcun problema di prestazioni, e probabilmente useranno comunque stat(2)
.
Quindi, se è costoso o no, non ci sono alternative ragionevoli.
Detto questo, come nel commento di Jim Mcnamara, non è costoso proprio per questi motivi. Dato che non ci sono alternative, i programmatori di glibc e linux lo hanno reso il più performante possibile.
Inoltre, considera di essere molto attento ai risultati del profilo eseguiti più volte. Avrai memorizzato nella cache ogni file che hai toccato, quindi la seconda esecuzione apparirà più o meno falsamente più velocemente sullo stesso set di file quando esegui nuovamente la ricerca. –
Un po 'come un intervento a cuore aperto a seguito di un attacco di cuore ... sì, è costoso, ma qual è l'alternativa ...? – Jonathan
E il team di chirurgia è un team di programmatori C incredibilmente talentuoso da tutto il mondo? –
La domanda sorge come "V/s costoso richiesto".
Ogni processo su Unix viene eseguito in due modalità: "Spazio utente" e "Spazio Kernel" e quando vengono emesse chiamate di sistema come open(), write(), stat(), il processo passa da User Space a Modalità Kernel che è costosa, ma solo se non stiamo facendo nulla di significativo con questa chiamata di sistema. Come se stessimo usando stat() per stampare solo l'ultima ora di accesso del file e nulla di più che stiamo facendo, allora probabilmente dovrei evitare .
Quindi, in primo luogo, ci dovrebbe essere una buona ragione per chiamare stat(). In secondo luogo se si desidera confrontare i tempi di esecuzione relativi di diversi pezzi del codice, utilizzare uno strumento di profilazione, che fornirà le statistiche esatte per dimostrare quale chiamata di funzione è costosa e quale no.
In quale altro modo si propone di fare ciò che fa? Evitare stat non ha senso. Se hai fatto un ls nella directory in qualsiasi momento, in passato probabilmente i file sono già memorizzati nella cache. Ad ogni modo - quindi, in che altro modo prendi mtime? Altro che chiamare stat o usare ls che chiama stat. –
È sempre possibile utilizzare strace
nell'eseguibile. Non è necessario ricompilare. Questa funzione consente di ottenere il tempo di esecuzione effettivo per ogni chiamata di sistema.
- 1. Context.getSystemService() è una chiamata costosa?
- 2. Ignorare una chiamata di sistema
- 3. DbContext è un'operazione costosa?
- 4. Perché la chiamata al metodo Java è così costosa qui?
- 5. Perché l'impaginazione è così costosa?
- 6. In un sistema operativo, qual è la differenza tra una chiamata di sistema e un interrupt?
- 7. chiamata di sistema in Ruby
- 8. aperta chiamata di sistema() polimorfismo
- 9. Query Selezionare Sistema chiamata
- 10. La creazione del socket è una procedura molto costosa?
- 11. Ricezione di più datagrammi in una singola chiamata di sistema
- 12. SQLite è la dichiarazione CASE costosa?
- 13. Chiamata di sistema senza commutazione di contesto?
- 14. Unix stat()/lstat() per Java
- 15. Una chiamata di sistema Perl() può mai morire?
- 16. Effettuare una chiamata di sistema per ottenere l'elenco dei processi
- 17. Chiamata di sistema per un core dump?
- 18. Selezionare() chiamata di sistema nei thread?
- 19. Quando la dimensione della chiamata del database è più costosa della frequenza delle chiamate?
- 20. L'operazione di ottenere l'id del tempo di thread corrente è costosa?
- 21. open() richiesta file di chiamata di sistema
- 22. La migliore strategia per memorizzare una costosa chiamata al servizio web in Grails
- 23. Qual è la differenza tra chiamata di sistema e chiamata di libreria?
- 24. x86_64 Confusione chiamata sistema di assi Linux
- 25. È possibile anticipare un thread nel mezzo di una chiamata di sistema al kernel?
- 26. Come gestire EINTR (chiamata di sistema interrotta)
- 27. come funziona la chiamata di sistema execlp()?
- 28. sta lanciando un'operazione costosa?
- 29. Come untaint chiamata di sistema in CGI.pm
- 30. Interpretazione di uscita perf stat
'costoso()'? È un'altra chiamata di sistema? – devnull
Hai provato la creazione di profili per vedere qual è effettivamente il costo? – ssube
La risposta breve è no. L'unica parte costosa sta leggendo l'inode del file dal disco. Dato che Linux inode in modo molto efficace, praticamente qualsiasi file che è stato visto in qualsiasi modo dal momento dell'avvio avrà già avuto l'inode già salvato nella cache. Ci sono altre chiamate come access(), ma chiama stat() comunque. fopen() o semplicemente open utilizza più risorse. –