From 0dee66260f2bde77d9edbf279e083de862b21b5c Mon Sep 17 00:00:00 2001 From: fauno Date: Thu, 22 Jul 2021 14:43:47 -0300 Subject: [PATCH] Optimize `Jekyll::Utils.parse_date` (#8425) Merge pull request 8425 --- benchmark/parse-date | 25 +++++++++++++++++++++++++ lib/jekyll/utils.rb | 3 ++- 2 files changed, 27 insertions(+), 1 deletion(-) create mode 100755 benchmark/parse-date diff --git a/benchmark/parse-date b/benchmark/parse-date new file mode 100755 index 00000000..9d1d1ed6 --- /dev/null +++ b/benchmark/parse-date @@ -0,0 +1,25 @@ +#!/usr/bin/env ruby + +require_relative '../lib/jekyll' +require 'benchmark/ips' + +date = "2014-08-02 14:43:06 PDT".freeze +time = Time.parse(date) + +Benchmark.ips do |x| + x.report('Time.parse') do + Time.parse(date) + end + + x.report('localtime') do + Time.parse(date).localtime + end + + x.report('localtime parsed') do + time.localtime + end + + x.report('Utils.parse_date') do + Jekyll::Utils.parse_date(date) + end +end diff --git a/lib/jekyll/utils.rb b/lib/jekyll/utils.rb index 5039c07a..49d67f4b 100644 --- a/lib/jekyll/utils.rb +++ b/lib/jekyll/utils.rb @@ -128,7 +128,8 @@ module Jekyll # Returns the parsed date if successful, throws a FatalException # if not def parse_date(input, msg = "Input could not be parsed.") - Time.parse(input).localtime + @parse_date_cache ||= {} + @parse_date_cache[input] ||= Time.parse(input).localtime rescue ArgumentError raise Errors::InvalidDateError, "Invalid date '#{input}': #{msg}" end