%%%------------------------------------------------------------------- %%% File : downcase.erl %%% Author : Jay Nelson %%% Description : %%% Benchmark for downcase performance. %%% %%% Created : 18 Jun 2005 by Jay Nelson %%%------------------------------------------------------------------- -module(downcase). %% API -export([ sampleString/0, largeString/0, time/2, test/5, downcase/1, slow_downcase/1, fast_downcase/2, fast_downcase/3, cap_filter/0, cap_map/0, cap_map_no_filt/0]). %%==================================================================== %% Tests %%==================================================================== sampleString() -> <<"This is a SenTence with SOME letters to DownCase.">>. largeString() -> B = sampleString(), list_to_binary(lists:duplicate(10000, B)). time(Type, small) -> Map_No_Filt = cap_map_no_filt(), Map = cap_map(), Filt = cap_filter(), Bin = sampleString(), timer:tc(downcase, test, [Type, Bin, Map_No_Filt, Map, Filt]); time(Type, large) -> Map_No_Filt = cap_map_no_filt(), Map = cap_map(), Filt = cap_filter(), Bin = largeString(), timer:tc(downcase, test, [Type, Bin, Map_No_Filt, Map, Filt]). test(slow, String, _, _, _) -> B = slow_downcase(String), size(B); test(normal, String, _, _, _) -> B = downcase(String), size(B); test(fast, String, _, Map, Filt) -> B = fast_downcase(String, Map, Filt), size(B); test(fastest, String, Map, _, _) -> B = fast_downcase(String, Map), size(B). %%==================================================================== %% API %%==================================================================== downcase(<<>>) -> <<>>; downcase(Bin) -> downcase(Bin, []). slow_downcase(<<>>) -> <<>>; slow_downcase(Bin) -> slow_downcase(binary_to_list(Bin), []). fast_downcase(Bin, Map) -> stream_xlate(Bin, Map). fast_downcase(Bin, Map, Filter) -> stream_xlate(Bin, Map, Filter). cap_filter() -> Filter = [ case I >= $A andalso I =< $Z of true -> 1; false -> 0 end || I <- lists:seq(0,255) ], list_to_binary(Filter). cap_map() -> Map = [ case I >= $A andalso I =< $Z of true -> I + $a - $A; false -> 0 end || I <- lists:seq(0,255) ], list_to_binary(Map). cap_map_no_filt() -> Map = [ mnf(I) || I <- lists:seq(0,255) ], list_to_binary(Map). mnf(C) when C >= $A, C =< $Z -> C + $a - $A; mnf(C) -> C. %%==================================================================== %% Internal functions %%==================================================================== downcase(<<>>, Result) -> list_to_binary(lists:reverse(Result)); downcase(<>, Result) -> NewChar = case Char >= $A andalso Char =< $Z of true -> Char + $a - $A; false -> Char end, downcase(Rest, [NewChar | Result]). slow_downcase([], Result) -> list_to_binary(lists:reverse(Result)); slow_downcase([Char | Rest], Result) -> NewChar = case Char >= $A andalso Char =< $Z of true -> Char + $a - $A; false -> Char end, slow_downcase(Rest, [NewChar | Result]).