]> arthur.barton.de Git - netdata.git/commitdiff
Now buffer_jsdate() and buffer_date() are a little bit faster.
authorFrederico Lamberti Pissarra <fredericopissarra@gmail.com>
Mon, 18 Apr 2016 12:51:11 +0000 (09:51 -0300)
committerFrederico Lamberti Pissarra <fredericopissarra@gmail.com>
Mon, 18 Apr 2016 12:51:11 +0000 (09:51 -0300)
src/web_buffer.c

index 482eb3900e024c5d3a1a553fa7948269baa0f72d..58214a891a1710c078a7c422612130d10cc66549 100644 (file)
@@ -187,43 +187,52 @@ void buffer_rrd_value(BUFFER *wb, calculated_number value)
 // generate a javascript date, the fastest possible way...
 void buffer_jsdate(BUFFER *wb, int year, int month, int day, int hours, int minutes, int seconds)
 {
-       //         10        20        30      = 35
+  //         10        20        30      = 35
        // 01234567890123456789012345678901234
        // Date(2014,04,01,03,28,20)
 
        buffer_need_bytes(wb, 30);
 
-       char *b = &wb->buffer[wb->len];
-
-       int i = 0;
-       b[i++]='D';
-       b[i++]='a';
-       b[i++]='t';
-       b[i++]='e';
-       b[i++]='(';
-       b[i++]= (char) (48 + year / 1000); year -= (year / 1000) * 1000;
-       b[i++]= (char) (48 + year / 100); year -= (year / 100) * 100;
-       b[i++]= (char) (48 + year / 10);
-       b[i++]= (char) (48 + year % 10);
-       b[i++]=',';
-       b[i]= (char) (48 + month / 10); if(b[i] != '0') i++;
-       b[i++]= (char) (48 + month % 10);
-       b[i++]=',';
-       b[i]= (char) (48 + day / 10); if(b[i] != '0') i++;
-       b[i++]= (char) (48 + day % 10);
-       b[i++]=',';
-       b[i]= (char) (48 + hours / 10); if(b[i] != '0') i++;
-       b[i++]= (char) (48 + hours % 10);
-       b[i++]=',';
-       b[i]= (char) (48 + minutes / 10); if(b[i] != '0') i++;
-       b[i++]= (char) (48 + minutes % 10);
-       b[i++]=',';
-       b[i]= (char) (48 + seconds / 10); if(b[i] != '0') i++;
-       b[i++]= (char) (48 + seconds % 10);
-       b[i++]=')';
-       b[i]='\0';
-
-       wb->len += i;
+       char *b = &wb->buffer[wb->len], *p;
+  unsigned int *q = (unsigned int *)b;  
+
+  #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
+    *q++ = 0x65746144;  // "Date" backwards.
+  #else
+    *q++ = 0x44617465;  // "Date"
+  #endif
+  p = (char *)q;
+
+  *p++ = '(';
+  *p++ = '0' + year / 1000; year %= 1000;
+  *p++ = '0' + year / 100;  year %= 100;
+  *p++ = '0' + year / 10;
+  *p++ = '0' + year % 100;
+  *p++ = ',';
+  *p   = '0' + month / 10; if (*p != '0') p++;
+  *p++ = '0' + month % 10;
+  *p++ = ',';
+  *p   = '0' + day / 10; if (*p != '0') p++;
+  *p++ = '0' + day % 10;
+  *p++ = ',';
+  *p   = '0' + hours / 10; if (*p != '0') p++;
+  *p++ = '0' + hours % 10;
+  *p++ = ',';
+  *p   = '0' + minutes / 10; if (*p != '0') p++;
+  *p++ = '0' + minutes % 10;
+  *p++ = ',';
+  *p   = '0' + seconds / 10; if (*p != '0') p++;
+  *p++ = '0' + seconds % 10;
+
+  unsigned short *r = (unsigned short *)p;
+
+#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
+    *r++ = 0x0029;  // ")\0" backwards.  
+  #else
+    *r++ = 0x2900;  // ")\0"
+  #endif
+
+       wb->len += (size_t)((char *)r - b - 1);
 
        // terminate it
        wb->buffer[wb->len] = '\0';
@@ -240,30 +249,30 @@ void buffer_date(BUFFER *wb, int year, int month, int day, int hours, int minute
        buffer_need_bytes(wb, 36);
 
        char *b = &wb->buffer[wb->len];
-
-       int i = 0;
-       b[i++]= (char) (48 + year / 1000); year -= (year / 1000) * 1000;
-       b[i++]= (char) (48 + year / 100); year -= (year / 100) * 100;
-       b[i++]= (char) (48 + year / 10);
-       b[i++]= (char) (48 + year % 10);
-       b[i++]='-';
-       b[i++]= (char) (48 + month / 10);
-       b[i++]= (char) (48 + month % 10);
-       b[i++]='-';
-       b[i++]= (char) (48 + day / 10);
-       b[i++]= (char) (48 + day % 10);
-       b[i++]=' ';
-       b[i++]= (char) (48 + hours / 10);
-       b[i++]= (char) (48 + hours % 10);
-       b[i++]=':';
-       b[i++]= (char) (48 + minutes / 10);
-       b[i++]= (char) (48 + minutes % 10);
-       b[i++]=':';
-       b[i++]= (char) (48 + seconds / 10);
-       b[i++]= (char) (48 + seconds % 10);
-       b[i]='\0';
-
-       wb->len += i;
+  char *p = b;
+
+  *p++ = '0' + year / 1000; year %= 1000;
+  *p++ = '0' + year / 100;  year %= 100;
+  *p++ = '0' + year / 10;
+  *p++ = '0' + year % 10;
+  *p++ = '-';
+  *p++ = '0' + month / 10;
+  *p++ = '0' + month % 10;
+  *p++ = '-';
+  *p++ = '0' + day / 10;
+  *p++ = '0' + day % 10;
+  *p++ = ' ';
+  *p++ = '0' + hours / 10;
+  *p++ = '0' + hours % 10;
+  *p++ = ' ';
+  *p++ = '0' + minutes / 10;
+  *p++ = '0' + minutes % 10;
+  *p++ = ' ';
+  *p++ = '0' + seconds / 10;
+  *p++ = '0' + seconds % 10;
+  *p = '\0';
+
+       wb->len += (size_t)(p - b);
 
        // terminate it
        wb->buffer[wb->len] = '\0';