Domanda

Sto lavorando su un progetto che non ha determinato un algoritmo per risolvere usando il linguaggio C. Sto usando la tecnica Monte Carlo per la soluzione di quel problema. E il numero di tentativi casuali voglio limite al tempo di esecuzione specificato dall'utente. Questo significa che vogliono fare pieno uso del termine di esecuzione definito dall'utente (come argomento della riga di comando) per rendere più iterazioni casuali possibili. Posso controllare il tempo di esecuzione trascorso finora per una condizione di loop?

for(trials=0;execution_time<specified_time;trials++)

Se sì, come posso fare? O se non v'è alcun altro modo anche, esso è accolto favorevolmente. Grazie.

P.S. Sto usando blocchi di codice 10,05 per la codifica e GNU compilatore.

È stato utile?

Soluzione

Sì, se si dispone di un orologio sufficientemente a grana fine sul computer (e si fa).

  1. Registra il momento in cui la simulazione iniziato.

  2. Per ogni giro del circuito, trovare il tempo corrente e il corrispondente delta tra l'ora di inizio e ora. Se il valore è più grande del limite, stop.

Se si utilizza time() con il suo un secondo granularità, attenzione degli effetti di quantizzazione. Se l'utente ha detto '1 secondo', si potrebbe finire in corsa per una piccola frazione di secondo se il programma ha iniziato a T = N.999s e si fermò a T = (N + 1) .001s. Lo stesso effetto è possibile con qualsiasi quantistica, ma poiché microsecondi e nanosecondi sono i normali granularità sub-seconda, la dimensione del quantum cessa di essere un problema.

Le funzioni dell'orologio ad alta risoluzione io conosco sono:

  • clock_gettime () - POSIX (nanosecondi)
  • gettimeofday () - POSIX (microsecondi)
  • volte () - Unix System V (CLK_TCK al secondo)
  • ftime () - Antica Unix (millisecondi)
  • clock () - ISO C - (CLOCKS_PER_SEC)
  • tempo () - ISO C - (secondo)

Altri suggerimenti

Si può provare l'orologio funzione standard (), che restituisce il numero di zecche orologio interno dal momento che l'avvio del programma. Vedere la documentazione di quella funzione per ulteriori informazioni.

Grazie a tutti per i vostri commenti. Un semplice codice a due linea ha fatto il lavoro per me:

time_t start_time = time(NULL);
while (((int)(time(NULL) - start_time)) < execution_time)
{
   /* ...... */
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top