aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLoïc Hoguin <[email protected]>2013-11-05 21:11:09 +0100
committerLoïc Hoguin <[email protected]>2013-11-05 21:11:09 +0100
commit1787a91a23c0e7dcd12d03ea421f453f33b9fb10 (patch)
treed34174349ff4bcb75d8cc534ed4cf6837d76bdad
parent5804a877d2d4166f3fca60c59fb950b054b0ba98 (diff)
downloadcowlib-1787a91a23c0e7dcd12d03ea421f453f33b9fb10.tar.gz
cowlib-1787a91a23c0e7dcd12d03ea421f453f33b9fb10.tar.bz2
cowlib-1787a91a23c0e7dcd12d03ea421f453f33b9fb10.zip
Add Horse tests and optimize cow_date:rfc2109/1
-rw-r--r--Makefile16
-rw-r--r--src/cow_date.erl157
2 files changed, 164 insertions, 9 deletions
diff --git a/Makefile b/Makefile
index 3074904..9c9f5b7 100644
--- a/Makefile
+++ b/Makefile
@@ -5,6 +5,10 @@ CT_SUITES = eunit
include erlang.mk
+.PHONY: gen perfs
+
+# Mimetypes module generator.
+
GEN_URL = http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types
GEN_SRC = src/cow_mimetypes.erl.src
GEN_OUT = src/cow_mimetypes.erl
@@ -25,3 +29,15 @@ gen:
$(gen_verbose) cat $(GEN_SRC) \
| tail -n +`grep -n "%% GENERATED" $(GEN_SRC) | cut -d : -f 1` \
>> $(GEN_OUT)
+
+# Performance testing.
+
+deps/horse:
+ git clone -n -- https://github.com/extend/horse $(DEPS_DIR)/horse
+ cd $(DEPS_DIR)/horse ; git checkout -q master
+ $(MAKE) -C $(DEPS_DIR)/horse
+
+perfs: ERLC_OPTS += -DPERF=1 +'{parse_transform, horse_autoexport}'
+perfs: clean deps deps/horse app
+ $(gen_verbose) erl -noshell -pa ebin deps/horse/ebin \
+ -eval 'horse:app_perf($(PROJECT)), init:stop().'
diff --git a/src/cow_date.erl b/src/cow_date.erl
index 3c5309c..a9641df 100644
--- a/src/cow_date.erl
+++ b/src/cow_date.erl
@@ -21,10 +21,13 @@
-spec rfc2109(calendar:datetime()) -> binary().
rfc2109({Date = {Y, Mo, D}, {H, Mi, S}}) ->
Wday = calendar:day_of_the_week(Date),
- << (weekday(Wday))/binary, ", ", (pad_int(D))/binary, "-",
- (month(Mo))/binary, "-", (list_to_binary(integer_to_list(Y)))/binary,
- " ", (pad_int(H))/binary, $:, (pad_int(Mi))/binary,
- $:, (pad_int(S))/binary, " GMT" >>.
+ << (weekday(Wday))/binary, ", ",
+ (pad_int(D))/binary, "-",
+ (month(Mo))/binary, "-",
+ (year(Y))/binary, " ",
+ (pad_int(H))/binary, ":",
+ (pad_int(Mi))/binary, ":",
+ (pad_int(S))/binary, " GMT" >>.
-ifdef(TEST).
rfc2109_test_() ->
@@ -35,13 +38,86 @@ rfc2109_test_() ->
[{R, fun() -> R = rfc2109(D) end} || {R, D} <- Tests].
-endif.
+-ifdef(PERF).
+horse_rfc2019_20130101_000000() ->
+ horse:repeat(100000,
+ rfc2109({{2013, 1, 1}, {0, 0, 0}})
+ ).
+
+horse_rfc2019_20131231_235959() ->
+ horse:repeat(100000,
+ rfc2109({{2013, 12, 31}, {23, 59, 59}})
+ ).
+
+horse_rfc2019_12340506_070809() ->
+ horse:repeat(100000,
+ rfc2109({{1234, 5, 6}, {7, 8, 9}})
+ ).
+-endif.
+
%% Internal.
--spec pad_int(0..59) -> binary().
-pad_int(X) when X < 10 ->
- << $0, ($0 + X) >>;
-pad_int(X) ->
- list_to_binary(integer_to_list(X)).
+-spec pad_int(0..59) -> <<_:16>>.
+pad_int( 0) -> <<"00">>;
+pad_int( 1) -> <<"01">>;
+pad_int( 2) -> <<"02">>;
+pad_int( 3) -> <<"03">>;
+pad_int( 4) -> <<"04">>;
+pad_int( 5) -> <<"05">>;
+pad_int( 6) -> <<"06">>;
+pad_int( 7) -> <<"07">>;
+pad_int( 8) -> <<"08">>;
+pad_int( 9) -> <<"09">>;
+pad_int(10) -> <<"10">>;
+pad_int(11) -> <<"11">>;
+pad_int(12) -> <<"12">>;
+pad_int(13) -> <<"13">>;
+pad_int(14) -> <<"14">>;
+pad_int(15) -> <<"15">>;
+pad_int(16) -> <<"16">>;
+pad_int(17) -> <<"17">>;
+pad_int(18) -> <<"18">>;
+pad_int(19) -> <<"19">>;
+pad_int(20) -> <<"20">>;
+pad_int(21) -> <<"21">>;
+pad_int(22) -> <<"22">>;
+pad_int(23) -> <<"23">>;
+pad_int(24) -> <<"24">>;
+pad_int(25) -> <<"25">>;
+pad_int(26) -> <<"26">>;
+pad_int(27) -> <<"27">>;
+pad_int(28) -> <<"28">>;
+pad_int(29) -> <<"29">>;
+pad_int(30) -> <<"30">>;
+pad_int(31) -> <<"31">>;
+pad_int(32) -> <<"32">>;
+pad_int(33) -> <<"33">>;
+pad_int(34) -> <<"34">>;
+pad_int(35) -> <<"35">>;
+pad_int(36) -> <<"36">>;
+pad_int(37) -> <<"37">>;
+pad_int(38) -> <<"38">>;
+pad_int(39) -> <<"39">>;
+pad_int(40) -> <<"40">>;
+pad_int(41) -> <<"41">>;
+pad_int(42) -> <<"42">>;
+pad_int(43) -> <<"43">>;
+pad_int(44) -> <<"44">>;
+pad_int(45) -> <<"45">>;
+pad_int(46) -> <<"46">>;
+pad_int(47) -> <<"47">>;
+pad_int(48) -> <<"48">>;
+pad_int(49) -> <<"49">>;
+pad_int(50) -> <<"50">>;
+pad_int(51) -> <<"51">>;
+pad_int(52) -> <<"52">>;
+pad_int(53) -> <<"53">>;
+pad_int(54) -> <<"54">>;
+pad_int(55) -> <<"55">>;
+pad_int(56) -> <<"56">>;
+pad_int(57) -> <<"57">>;
+pad_int(58) -> <<"58">>;
+pad_int(59) -> <<"59">>.
-spec weekday(1..7) -> <<_:24>>.
weekday(1) -> <<"Mon">>;
@@ -65,3 +141,66 @@ month( 9) -> <<"Sep">>;
month(10) -> <<"Oct">>;
month(11) -> <<"Nov">>;
month(12) -> <<"Dec">>.
+
+-spec year(pos_integer()) -> <<_:32>>.
+year(1970) -> <<"1970">>;
+year(1971) -> <<"1971">>;
+year(1972) -> <<"1972">>;
+year(1973) -> <<"1973">>;
+year(1974) -> <<"1974">>;
+year(1975) -> <<"1975">>;
+year(1976) -> <<"1976">>;
+year(1977) -> <<"1977">>;
+year(1978) -> <<"1978">>;
+year(1979) -> <<"1979">>;
+year(1980) -> <<"1980">>;
+year(1981) -> <<"1981">>;
+year(1982) -> <<"1982">>;
+year(1983) -> <<"1983">>;
+year(1984) -> <<"1984">>;
+year(1985) -> <<"1985">>;
+year(1986) -> <<"1986">>;
+year(1987) -> <<"1987">>;
+year(1988) -> <<"1988">>;
+year(1989) -> <<"1989">>;
+year(1990) -> <<"1990">>;
+year(1991) -> <<"1991">>;
+year(1992) -> <<"1992">>;
+year(1993) -> <<"1993">>;
+year(1994) -> <<"1994">>;
+year(1995) -> <<"1995">>;
+year(1996) -> <<"1996">>;
+year(1997) -> <<"1997">>;
+year(1998) -> <<"1998">>;
+year(1999) -> <<"1999">>;
+year(2000) -> <<"2000">>;
+year(2001) -> <<"2001">>;
+year(2002) -> <<"2002">>;
+year(2003) -> <<"2003">>;
+year(2004) -> <<"2004">>;
+year(2005) -> <<"2005">>;
+year(2006) -> <<"2006">>;
+year(2007) -> <<"2007">>;
+year(2008) -> <<"2008">>;
+year(2009) -> <<"2009">>;
+year(2010) -> <<"2010">>;
+year(2011) -> <<"2011">>;
+year(2012) -> <<"2012">>;
+year(2013) -> <<"2013">>;
+year(2014) -> <<"2014">>;
+year(2015) -> <<"2015">>;
+year(2016) -> <<"2016">>;
+year(2017) -> <<"2017">>;
+year(2018) -> <<"2018">>;
+year(2019) -> <<"2019">>;
+year(2020) -> <<"2020">>;
+year(2021) -> <<"2021">>;
+year(2022) -> <<"2022">>;
+year(2023) -> <<"2023">>;
+year(2024) -> <<"2024">>;
+year(2025) -> <<"2025">>;
+year(2026) -> <<"2026">>;
+year(2027) -> <<"2027">>;
+year(2028) -> <<"2028">>;
+year(2029) -> <<"2029">>;
+year(Year) -> list_to_binary(integer_to_list(Year)).