Estoy escribiendo un programa de red que puede calcular la tasa de paquetes de datos precisa (paquete por segundo, cuadro por segundo, bps). Ahora tengo un dispositivo llamado testcenter que puede enviar un flujo preciso a una computadora específica (el protocolo es UDP/IP) en Linux, me gusta saber los pps (paquetes por segundo) precisos con mi programa, he considerado gettimeofday(&start,NULL) antes de llamar a recvfrom() y actualizar el contador de paquetes, luego llamar a gettimeofday(&end,NULL) y obtener la tasa de pps. Espero que haya una solución mejor que esta, ya que la barrera de usuario/núcleo se atraviesa en las llamadas al sistema. Saludos.
Creo que deberías usar clock_gettime() con CLOCK_MONOTONIC_COARSE. Pero solo será preciso hasta el último tic. Por lo tanto, puede estar errado por decenas de milisegundos. Pero definitivamente es más rápido que usarlo con CLOCK_MONOTONIC_RAW. También puede usar gettimeofday pero clock_gettime con CLOCK_MONOTONIC_RAW es ligeramente más rápido y de mayor resolución que gettimeofday. También gettimeofday() da la hora del reloj de pared, que podría cambiar incluso para el horario de verano... No creo que debas usarlo para medir la tasa de tráfico.
Su observación de que gettimeofday cambia al modo kernel es incorrecta para Linux en algunas arquitecturas populares debido al uso de vsyscalls. Claramente, usar gettimeofday aquí no es una mala opción. Sin embargo, debería considerar usar un reloj monótono, vea man 3 clock_gettime . Tenga en cuenta que clock_gettime aún no se ha convertido a vsyscall para tantas arquitecturas como gettimeofday .
Más allá de esta opción, puede configurar la opción de socket SO_TIMESTAMP y obtener marcas de tiempo precisas a través recvmsg .