Permalink
Browse files

Improve Time.new() performance using division; fix #3561

  • Loading branch information...
matz committed Apr 1, 2017
1 parent 195af52 commit 8d9d7c929e4987b4332e33c5126b620ba7c0c2b3
Showing with 11 additions and 7 deletions.
  1. +11 −7 mrbgems/mruby-time/src/time.c
@@ -11,6 +11,8 @@
#include <mruby/class.h>
#include <mruby/data.h>
#define NDIV(x,y) (-(-((x)+1)/(y))-1)
#if _MSC_VER < 1800
double round(double x) {
if (x >= 0.0) {
@@ -237,13 +239,15 @@ time_alloc(mrb_state *mrb, double sec, double usec, enum mrb_timezone timezone)
tm = (struct mrb_time *)mrb_malloc(mrb, sizeof(struct mrb_time));
tm->sec = tsec;
tm->usec = (time_t)llround((sec - tm->sec) * 1.0e6 + usec);
while (tm->usec < 0) {
tm->sec--;
tm->usec += 1000000;
}
while (tm->usec >= 1000000) {
tm->sec++;
tm->usec -= 1000000;
if (tm->usec < 0) {
long sec2 = NDIV(usec,1000000); /* negative div */
tm->usec -= sec2 * 1000000;
tm->sec += sec2;
}
if (tm->usec >= 1000000) {
long sec2 = usec / 1000000;
tm->usec -= sec2 * 1000000;
tm->sec += sec2;
}
tm->timezone = timezone;
time_update_datetime(mrb, tm);

0 comments on commit 8d9d7c9

Please sign in to comment.