@cryptotaxi247 / netdata-1 / commits / dc592ce38

Now buffer_jsdate() and buffer_date() are a little bit faster.

Frederico Lamberti Pissarra committed Apr 18, 2016 at 09:51 UTC dc592ce38ee07cb86246ab6a3e230f76c4f48ccf
1 file changed +65 -56
src/web_buffer.c
+65 -56
@@ -187,43 +187,52 @@ void buffer_rrd_value(BUFFER *wb, calculated_number value)
187 // generate a javascript date, the fastest possible way...
188 void buffer_jsdate(BUFFER *wb, int year, int month, int day, int hours, int minutes, int seconds)
189 {
190 - // 10 20 30 = 35
190 + // 10 20 30 = 35
191 // 01234567890123456789012345678901234
192 // Date(2014,04,01,03,28,20)
193
194 buffer_need_bytes(wb, 30);
195
196 - char *b = &wb->buffer[wb->len];
197 -
198 - int i = 0;
199 - b[i++]='D';
200 - b[i++]='a';
201 - b[i++]='t';
202 - b[i++]='e';
203 - b[i++]='(';
204 - b[i++]= (char) (48 + year / 1000); year -= (year / 1000) * 1000;
205 - b[i++]= (char) (48 + year / 100); year -= (year / 100) * 100;
206 - b[i++]= (char) (48 + year / 10);
207 - b[i++]= (char) (48 + year % 10);
208 - b[i++]=',';
209 - b[i]= (char) (48 + month / 10); if(b[i] != '0') i++;
210 - b[i++]= (char) (48 + month % 10);
211 - b[i++]=',';
212 - b[i]= (char) (48 + day / 10); if(b[i] != '0') i++;
213 - b[i++]= (char) (48 + day % 10);
214 - b[i++]=',';
215 - b[i]= (char) (48 + hours / 10); if(b[i] != '0') i++;
216 - b[i++]= (char) (48 + hours % 10);
217 - b[i++]=',';
218 - b[i]= (char) (48 + minutes / 10); if(b[i] != '0') i++;
219 - b[i++]= (char) (48 + minutes % 10);
220 - b[i++]=',';
221 - b[i]= (char) (48 + seconds / 10); if(b[i] != '0') i++;
222 - b[i++]= (char) (48 + seconds % 10);
223 - b[i++]=')';
224 - b[i]='\0';
225 -
226 - wb->len += i;
196 + char *b = &wb->buffer[wb->len], *p;
197 + unsigned int *q = (unsigned int *)b;
198 +
199 + #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
200 + *q++ = 0x65746144; // "Date" backwards.
201 + #else
202 + *q++ = 0x44617465; // "Date"
203 + #endif
204 + p = (char *)q;
205 +
206 + *p++ = '(';
207 + *p++ = '0' + year / 1000; year %= 1000;
208 + *p++ = '0' + year / 100; year %= 100;
209 + *p++ = '0' + year / 10;
210 + *p++ = '0' + year % 100;
211 + *p++ = ',';
212 + *p = '0' + month / 10; if (*p != '0') p++;
213 + *p++ = '0' + month % 10;
214 + *p++ = ',';
215 + *p = '0' + day / 10; if (*p != '0') p++;
216 + *p++ = '0' + day % 10;
217 + *p++ = ',';
218 + *p = '0' + hours / 10; if (*p != '0') p++;
219 + *p++ = '0' + hours % 10;
220 + *p++ = ',';
221 + *p = '0' + minutes / 10; if (*p != '0') p++;
222 + *p++ = '0' + minutes % 10;
223 + *p++ = ',';
224 + *p = '0' + seconds / 10; if (*p != '0') p++;
225 + *p++ = '0' + seconds % 10;
226 +
227 + unsigned short *r = (unsigned short *)p;
228 +
229 +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
230 + *r++ = 0x0029; // ")\0" backwards.
231 + #else
232 + *r++ = 0x2900; // ")\0"
233 + #endif
234 +
235 + wb->len += (size_t)((char *)r - b - 1);
236
237 // terminate it
238 wb->buffer[wb->len] = '\0';
@@ -240,30 +249,30 @@ void buffer_date(BUFFER *wb, int year, int month, int day, int hours, int minute
249 buffer_need_bytes(wb, 36);
250
251 char *b = &wb->buffer[wb->len];
243 -
244 - int i = 0;
245 - b[i++]= (char) (48 + year / 1000); year -= (year / 1000) * 1000;
246 - b[i++]= (char) (48 + year / 100); year -= (year / 100) * 100;
247 - b[i++]= (char) (48 + year / 10);
248 - b[i++]= (char) (48 + year % 10);
249 - b[i++]='-';
250 - b[i++]= (char) (48 + month / 10);
251 - b[i++]= (char) (48 + month % 10);
252 - b[i++]='-';
253 - b[i++]= (char) (48 + day / 10);
254 - b[i++]= (char) (48 + day % 10);
255 - b[i++]=' ';
256 - b[i++]= (char) (48 + hours / 10);
257 - b[i++]= (char) (48 + hours % 10);
258 - b[i++]=':';
259 - b[i++]= (char) (48 + minutes / 10);
260 - b[i++]= (char) (48 + minutes % 10);
261 - b[i++]=':';
262 - b[i++]= (char) (48 + seconds / 10);
263 - b[i++]= (char) (48 + seconds % 10);
264 - b[i]='\0';
265 -
266 - wb->len += i;
252 + char *p = b;
253 +
254 + *p++ = '0' + year / 1000; year %= 1000;
255 + *p++ = '0' + year / 100; year %= 100;
256 + *p++ = '0' + year / 10;
257 + *p++ = '0' + year % 10;
258 + *p++ = '-';
259 + *p++ = '0' + month / 10;
260 + *p++ = '0' + month % 10;
261 + *p++ = '-';
262 + *p++ = '0' + day / 10;
263 + *p++ = '0' + day % 10;
264 + *p++ = ' ';
265 + *p++ = '0' + hours / 10;
266 + *p++ = '0' + hours % 10;
267 + *p++ = ' ';
268 + *p++ = '0' + minutes / 10;
269 + *p++ = '0' + minutes % 10;
270 + *p++ = ' ';
271 + *p++ = '0' + seconds / 10;
272 + *p++ = '0' + seconds % 10;
273 + *p = '\0';
274 +
275 + wb->len += (size_t)(p - b);
276
277 // terminate it
278 wb->buffer[wb->len] = '\0';