[tpop3d-discuss][PATCH]: avoid tons of time() calls

Arkadiusz Miskiewicz arekm at pld-linux.org
Wed, 28 Jun 2006 20:10:37 +0200


On Wednesday 28 June 2006 19:52, Arkadiusz Miskiewicz wrote:
> Hi,
>
> I've just checked that on busy server I get
> nearly 10000 time() calls per second!
>
> # grep  19:36:04 OUT |grep time | wc -l
> 9668
>
> where OUT is output from strace -tt -f -F -s 200 -p 5571 -o OUT
> (5571 is main parent of all tpop3d childs).
>
> Do we need to call it so often?
>
> In most cases if (!(c =3D connections[i])) will just continue and I see no
> point to check time every iteration.
>
> --- netloop.c       2006-06-26 07:30:25.000000000 +0200
> +++ netloop.c   2006-06-28 19:46:00.000000000 +0200
> @@ -387,16 +387,20 @@
>      static size_t i;
>      size_t i0;
>      time_t start;
> +    int latency =3D 1;
>
>      time(&start);
>
> -    for (i0 =3D (i + max_connections - 1) % max_connections; time(NULL) <
> start + LATENCY && i !=3D i0; i =3D (i + 1) % max_connections) { +    for=
 (i0 =3D
> (i + max_connections - 1) % max_connections; latency && i !=3D i0; i =3D =
(i +
> 1) % max_connections) { connection c;
>          int r;
>
>          if (!(c =3D connections[i]))
>              continue;
>
> +       if (time(NULL) >=3D start + LATENCY)
> +               latency =3D 0;
> +
>          if (i > 0 && post_fork) {
>              connections[0] =3D c;
>              connections[i] =3D NULL;

Even better:

@@ -387,16 +387,22 @@
     static size_t i;
     size_t i0;
     time_t start;
+    int latency =3D 1;

     time(&start);

=2D    for (i0 =3D (i + max_connections - 1) % max_connections; time(NULL) =
< start + LATENCY && i !=3D i0; i =3D (i + 1) % max_connections) {
+    for (i0 =3D (i + max_connections - 1) % max_connections; latency && i =
!=3D i0; i =3D (i + 1) % max_connections) {
         connection c;
         int r;

         if (!(c =3D connections[i]))
             continue;

+       if (time(NULL) >=3D start + LATENCY) {
+               latency =3D 0;
+               continue;
+       }
+
         if (i > 0 && post_fork) {
             connections[0] =3D c;
             connections[i] =3D NULL;


ps. remember poll(..., n + 1, ...) change to poll(..., n, ....) in my lates=
t ,,fixes'' patch?
The original (n+1) was correct, please revert that change. poll want's numb=
er
of elements in an array - not highest index. Sorry for that.

=2D-=20
Arkadiusz Mi=B6kiewicz        PLD/Linux Team
arekm / maven.pl            http://ftp.pld-linux.org/