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';