GetTimeOfday est une fonction de bibliothèque standard en langue C, qui est généralement utilisée pour obtenir le temps du système actuel, avec une précision atteignant des microsecondes. Sa déclaration est la suivante:
<span><span><span class="hljs-type">int</span></span><span> </span><span><span class="hljs-title function_">gettimeofday</span></span><span><span class="hljs-params">(<span class="hljs-keyword">struct</span></span></span><span> timeval *tv, </span><span><span class="hljs-keyword">struct</span></span><span> timezone *tz);
</span></span>
La télévision est une structure TimeVal qui contient des secondes et des microsecondes;
TZ est des informations de fuseau horaire, et nous pouvons généralement passer null car les informations de fuseau horaire ne sont pas dans notre objectif.
La valeur de retour de GetTimeofday est l'heure actuelle, en secondes et microsecondes, qui peuvent être utilisées pour calculer avec précision le temps d'exécution de la tâche.
fonction de sommeil
La fonction de sommeil est utilisée pour suspendre l'exécution d'un programme, et son unité est des secondes, qui est généralement utilisée pour contrôler le temps d'attente du code. Sa déclaration est la suivante:
<span><span><span class="hljs-type">unsigned</span></span><span> </span><span><span class="hljs-type">int</span></span><span> </span><span><span class="hljs-title function_">sleep</span></span><span><span class="hljs-params">(<span class="hljs-type">unsigned</span></span></span><span> </span><span><span class="hljs-type">int</span></span><span> seconds);
</span></span>
Mais la fonction de sommeil ne peut être précise qu'au deuxième niveau. Si un contrôle de temps de précision plus élevé est requis, nous pouvons utiliser la fonction Usleep , ce qui nous permet de passer du temps au niveau de la microseconde.
Supposons que vous deviez contrôler avec précision le temps d'exécution de la tâche dans le programme, comme l'exécution de la tâche doit être bouclée dans un intervalle de temps fixe, mais vous ne voulez pas que le temps d'exécution de la tâche soit trop long ou trop court. Nous pouvons utiliser GetTimeOfday pour obtenir l'heure actuelle et combiner la fonction de sommeil pour ajuster l'intervalle de chaque exécution.
Obtenez l'heure actuelle
Nous appelons d'abord GetTimeOfday pour obtenir l'heure actuelle du système. Cela indiquera le moment où la tâche commence à être exécutée.
Calculez l'heure cible
Supposons que nous ayons besoin que la tâche soit exécutée toutes les 100 millisecondes. Après avoir obtenu l'heure de début, vous pouvez calculer l'heure cible pour l'exécution de la tâche suivante. Le temps cible est égal à l'heure actuelle plus l'intervalle d'exécution de la tâche.
Attendez que l'heure cible arrive
Après avoir calculé l'heure cible, nous pouvons calculer la différence entre l'heure actuelle et l'heure cible et utiliser le sommeil ou le sommeil pour attendre avec précision. Cela peut empêcher l'exécution de la tâche trop longue ou trop courte.
Contrôler la précision des tâches
Si vous souhaitez contrôler plus précisément le temps d'exécution de la tâche, vous pouvez vérifier l'heure actuelle après l'exécution de la tâche pour vous assurer que l'intervalle entre les tâches répond aux exigences.
Voici un exemple de code qui utilise GetTimeOfday et Sleep pour contrôler le temps d'exécution des tâches:
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// Définissez le temps d'intervalle pour chaque tâche exécution(unité:Secondes et microsecondes)</span></span><span>
</span><span><span class="hljs-variable">$interval_sec</span></span><span> = </span><span><span class="hljs-number">0</span></span><span>; </span><span><span class="hljs-comment">// Deuxième</span></span><span>
</span><span><span class="hljs-variable">$interval_usec</span></span><span> = </span><span><span class="hljs-number">100000</span></span><span>; </span><span><span class="hljs-comment">// 微Deuxième,100毫Deuxième</span></span><span>
</span><span><span class="hljs-comment">// Obtenez l'heure actuelle</span></span><span>
</span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">getCurrentTime</span></span><span>(</span><span><span class="hljs-params"></span></span><span>) {
</span><span><span class="hljs-variable">$time</span></span><span> = </span><span><span class="hljs-title function_ invoke__">gettimeofday</span></span><span>();
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$time</span></span><span>[</span><span><span class="hljs-string">'sec'</span></span><span>] * </span><span><span class="hljs-number">1000000</span></span><span> + </span><span><span class="hljs-variable">$time</span></span><span>[</span><span><span class="hljs-string">'usec'</span></span><span>]; </span><span><span class="hljs-comment">// 返回当前时间的微Deuxième数</span></span><span>
}
</span><span><span class="hljs-comment">// Calculez le temps cible pour l'exécution des tâches</span></span><span>
</span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">getTargetTime</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$interval_sec</span></span></span><span>, </span><span><span class="hljs-variable">$interval_usec</span></span><span>) {
</span><span><span class="hljs-variable">$current_time</span></span><span> = </span><span><span class="hljs-title function_ invoke__">getCurrentTime</span></span><span>();
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$current_time</span></span><span> + </span><span><span class="hljs-variable">$interval_sec</span></span><span> * </span><span><span class="hljs-number">1000000</span></span><span> + </span><span><span class="hljs-variable">$interval_usec</span></span><span>;
}
</span><span><span class="hljs-comment">// Simuler une tâche chronométrée</span></span><span>
</span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">performTask</span></span><span>(</span><span><span class="hljs-params"></span></span><span>) {
</span><span><span class="hljs-comment">// Simuler l'exécution de la tâche(Par exemple:Traitement des données、demanderAPIattendez)</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Task performed at: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">date</span></span><span>(</span><span><span class="hljs-string">"Y-m-d H:i:s"</span></span><span>) . </span><span><span class="hljs-string">"\n"</span></span><span>;
}
</span><span><span class="hljs-comment">// Programme principal</span></span><span>
</span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-literal">true</span></span><span>) {
</span><span><span class="hljs-comment">// Obtenez l'heure actuelle</span></span><span>
</span><span><span class="hljs-variable">$current_time</span></span><span> = </span><span><span class="hljs-title function_ invoke__">getCurrentTime</span></span><span>();
</span><span><span class="hljs-comment">// Calculez l'heure cible</span></span><span>
</span><span><span class="hljs-variable">$target_time</span></span><span> = </span><span><span class="hljs-title function_ invoke__">getTargetTime</span></span><span>(</span><span><span class="hljs-variable">$interval_sec</span></span><span>, </span><span><span class="hljs-variable">$interval_usec</span></span><span>);
</span><span><span class="hljs-comment">// Effectuer des tâches</span></span><span>
</span><span><span class="hljs-title function_ invoke__">performTask</span></span><span>();
</span><span><span class="hljs-comment">// 计算attendez待时间</span></span><span>
</span><span><span class="hljs-variable">$sleep_time</span></span><span> = </span><span><span class="hljs-variable">$target_time</span></span><span> - </span><span><span class="hljs-title function_ invoke__">getCurrentTime</span></span><span>();
</span><span><span class="hljs-comment">// Si le temps d'exécution de la tâche est court,Peut être passé usleep 来精确attendez待</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$sleep_time</span></span><span> > </span><span><span class="hljs-number">0</span></span><span>) {
</span><span><span class="hljs-title function_ invoke__">usleep</span></span><span>(</span><span><span class="hljs-variable">$sleep_time</span></span><span>); </span><span><span class="hljs-comment">// attendez待直到目标时间到达</span></span><span>
}
}
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
Dans cet exemple, la tâche est exécutée toutes les 100 millisecondes. Obtenez l'heure actuelle via la fonction GetTimeOfday , calculez l'heure cible, puis utilisez la fonction Usleep pour attendre avec précision. Cela permettra un contrôle précis des tâches et évitera les écarts de temps causés par la planification du système ou d'autres facteurs.