Advertisement
Guest User

Untitled

a guest
Feb 27th, 2017
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.75 KB | None | 0 0
  1. defmodule MyMap do
  2. def bodyrecursive([]) do [] end
  3. def bodyrecursive([h|t]) do [h + 1 | bodyrecursive(t)] end
  4.  
  5. def generic_bodyrecursive([], _) do [] end
  6. def generic_bodyrecursive([h|t], fun) do [fun.(h) | bodyrecursive(t)] end
  7.  
  8. def tail(list) do tail(list, []) end
  9. defp tail([], acc) do :lists.reverse(acc) end
  10. defp tail([h|t], acc) do tail(t, [h + 1 | acc]) end
  11.  
  12. def generic_tail(list, fun) do generic_tail(list, fun, []) end
  13. defp generic_tail([], _, acc) do :lists.reverse(acc) end
  14. defp generic_tail([h|t], fun, acc) do generic_tail(t, fun, [fun.(h) | acc]) end
  15.  
  16.  
  17. def map_tco(list, function) do Enum.reverse _map_tco([], list, function) end
  18. defp _map_tco(acc, [head | tail], function) do _map_tco([function.(head) | acc], tail, function) end
  19. defp _map_tco(acc, [], _function) do acc end
  20.  
  21. def map_tco_concat(acc \\ [], list, function)
  22. def map_tco_concat(acc, [head | tail], function) do map_tco_concat(acc ++ [function.(head)], tail, function) end
  23. def map_tco_concat(acc, [], _function) do acc end
  24.  
  25. def map_tco_no_reverse(list, function) do _map_tco([], list, function) end
  26. end
  27.  
  28.  
  29.  
  30. map_fun = fn(i) -> i + 1 end
  31. inputs = %{
  32. "1-Small 1 Thousand" => Enum.to_list(1..1_000),
  33. "2-Middle 100 Thousand" => Enum.to_list(1..100_000),
  34. "3-Big 10 Million" => Enum.to_list(1..10_000_000)
  35. }
  36.  
  37. Benchee.run(%{
  38. "tail" =>
  39. fn list -> list |> MyMap.tail end,
  40.  
  41. "generic_tail fn" =>
  42. fn list -> list |> MyMap.generic_tail(fn x -> x + 1 end) end,
  43.  
  44. "generic_tail &" =>
  45. fn list -> list |> MyMap.generic_tail(&(&1 + 1)) end,
  46.  
  47. "bodyrecursive" =>
  48. fn list -> list |> MyMap.bodyrecursive end,
  49.  
  50. "generic_bodyrecursive fn" =>
  51. fn list -> list |> MyMap.generic_bodyrecursive(fn x -> x + 1 end) end,
  52.  
  53. "generic_bodyrecursive &" =>
  54. fn list -> list |> MyMap.generic_bodyrecursive(&(&1 + 1)) end,
  55.  
  56. "stdlib fn" =>
  57. fn list -> list |> Enum.map(fn x -> x + 1 end) end,
  58.  
  59. "stdlib &" =>
  60. fn list -> list |> Enum.map(&(&1 + 1)) end,
  61.  
  62. "list comprehension" =>
  63. fn list -> for x <- list do x + 1 end end,
  64.  
  65. "map with tail and reverse" =>
  66. fn(list) -> MyMap.map_tco(list, map_fun) end,
  67.  
  68. "map tco no reverse" =>
  69. fn(list) -> MyMap.map_tco_no_reverse(list, map_fun) end,
  70.  
  71. },
  72. time: 15,
  73. warmup: 5,
  74. inputs: inputs,
  75. formatters: [
  76. &Benchee.Formatters.HTML.output/1,
  77. &Benchee.Formatters.Console.output/1
  78. ],
  79. html: [file: "report.html"]
  80. )
  81.  
  82. # Erlang/OTP 19 [erts-8.2] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]
  83. # Elixir 1.4.1
  84. # Benchmark suite executing with the following configuration:
  85. # warmup: 5.0s
  86. # time: 15.0s
  87. # parallel: 1
  88. # inputs: 1-Small 1 Thousand, 2-Middle 100 Thousand, 3-Big 10 Million
  89. # Estimated total run time: 660.0s
  90.  
  91.  
  92. # Benchmarking with input 1-Small 1 Thousand:
  93. # Benchmarking bodyrecursive...
  94. # Benchmarking generic_bodyrecursive &...
  95. # Benchmarking generic_bodyrecursive fn...
  96. # Benchmarking generic_tail &...
  97. # Benchmarking generic_tail fn...
  98. # Benchmarking list comprehension...
  99. # Benchmarking map tco no reverse...
  100. # Benchmarking map with tail and reverse...
  101. # Benchmarking stdlib &...
  102. # Benchmarking stdlib fn...
  103. # Benchmarking tail...
  104.  
  105. # Benchmarking with input 2-Middle 100 Thousand:
  106. # Benchmarking bodyrecursive...
  107. # Benchmarking generic_bodyrecursive &...
  108. # Benchmarking generic_bodyrecursive fn...
  109. # Benchmarking generic_tail &...
  110. # Benchmarking generic_tail fn...
  111. # Benchmarking list comprehension...
  112. # Benchmarking map tco no reverse...
  113. # Benchmarking map with tail and reverse...
  114. # Benchmarking stdlib &...
  115. # Benchmarking stdlib fn...
  116. # Benchmarking tail...
  117.  
  118. # Benchmarking with input 3-Big 10 Million:
  119. # Benchmarking bodyrecursive...
  120. # Benchmarking generic_bodyrecursive &...
  121. # Benchmarking generic_bodyrecursive fn...
  122. # Benchmarking generic_tail &...
  123. # Benchmarking generic_tail fn...
  124. # Benchmarking list comprehension...
  125. # Benchmarking map tco no reverse...
  126. # Benchmarking map with tail and reverse...
  127. # Benchmarking stdlib &...
  128. # Benchmarking stdlib fn...
  129. # Benchmarking tail...
  130. # Generated report_1-small_1_thousand.html
  131. # Generated report_2-middle_100_thousand.html
  132. # Generated report_3-big_10_million.html
  133.  
  134. # ##### With input 1-Small 1 Thousand #####
  135. # Name ips average deviation median
  136. # tail 63.07 K 15.85 μs ±195.72% 13.00 μs
  137. # bodyrecursive 58.57 K 17.07 μs ±143.66% 15.00 μs
  138. # generic_bodyrecursive & 56.47 K 17.71 μs ±121.19% 16.00 μs
  139. # generic_bodyrecursive fn 55.32 K 18.08 μs ±119.32% 16.00 μs
  140. # stdlib fn 30.56 K 32.73 μs ±128.55% 30.00 μs
  141. # map tco no reverse 30.49 K 32.80 μs ±61.16% 31.00 μs
  142. # stdlib & 28.34 K 35.28 μs ±72.55% 32.00 μs
  143. # generic_tail fn 27.21 K 36.75 μs ±167.29% 32.00 μs
  144. # list comprehension 26.55 K 37.67 μs ±394.51% 31.00 μs
  145. # generic_tail & 26.48 K 37.76 μs ±64.60% 33.00 μs
  146. # map with tail and reverse 25.80 K 38.75 μs ±145.98% 34.00 μs
  147.  
  148. # Comparison:
  149. # tail 63.07 K
  150. # bodyrecursive 58.57 K - 1.08x slower
  151. # generic_bodyrecursive & 56.47 K - 1.12x slower
  152. # generic_bodyrecursive fn 55.32 K - 1.14x slower
  153. # stdlib fn 30.56 K - 2.06x slower
  154. # map tco no reverse 30.49 K - 2.07x slower
  155. # stdlib & 28.34 K - 2.23x slower
  156. # generic_tail fn 27.21 K - 2.32x slower
  157. # list comprehension 26.55 K - 2.38x slower
  158. # generic_tail & 26.48 K - 2.38x slower
  159. # map with tail and reverse 25.80 K - 2.44x slower
  160.  
  161. # ##### With input 2-Middle 100 Thousand #####
  162. # Name ips average deviation median
  163. # generic_bodyrecursive & 519.02 1.93 ms ±20.57% 1.79 ms
  164. # generic_bodyrecursive fn 499.03 2.00 ms ±46.20% 1.89 ms
  165. # bodyrecursive 494.41 2.02 ms ±21.15% 1.91 ms
  166. # tail 428.99 2.33 ms ±40.93% 2.13 ms
  167. # stdlib & 261.78 3.82 ms ±19.01% 3.63 ms
  168. # map tco no reverse 257.84 3.88 ms ±30.36% 3.65 ms
  169. # stdlib fn 245.02 4.08 ms ±24.77% 3.83 ms
  170. # generic_tail & 237.28 4.21 ms ±30.86% 3.92 ms
  171. # list comprehension 234.36 4.27 ms ±28.82% 4.00 ms
  172. # generic_tail fn 215.86 4.63 ms ±37.15% 4.29 ms
  173. # map with tail and reverse 197.28 5.07 ms ±40.31% 4.73 ms
  174.  
  175. # Comparison:
  176. # generic_bodyrecursive & 519.02
  177. # generic_bodyrecursive fn 499.03 - 1.04x slower
  178. # bodyrecursive 494.41 - 1.05x slower
  179. # tail 428.99 - 1.21x slower
  180. # stdlib & 261.78 - 1.98x slower
  181. # map tco no reverse 257.84 - 2.01x slower
  182. # stdlib fn 245.02 - 2.12x slower
  183. # generic_tail & 237.28 - 2.19x slower
  184. # list comprehension 234.36 - 2.21x slower
  185. # generic_tail fn 215.86 - 2.40x slower
  186. # map with tail and reverse 197.28 - 2.63x slower
  187.  
  188. # ##### With input 3-Big 10 Million #####
  189. # Name ips average deviation median
  190. # map tco no reverse 2.51 399.11 ms ±19.71% 373.50 ms
  191. # tail 1.84 543.93 ms ±41.75% 486.18 ms
  192. # list comprehension 1.41 707.87 ms ±19.18% 675.98 ms
  193. # map with tail and reverse 1.40 714.90 ms ±18.26% 686.56 ms
  194. # generic_tail fn 1.40 714.99 ms ±21.67% 666.39 ms
  195. # generic_tail & 1.20 832.02 ms ±24.42% 803.23 ms
  196. # generic_bodyrecursive fn 0.98 1015.60 ms ±22.63% 1056.96 ms
  197. # generic_bodyrecursive & 0.90 1114.73 ms ±24.02% 1130.33 ms
  198. # stdlib & 0.88 1142.06 ms ±19.41% 1219.39 ms
  199. # stdlib fn 0.87 1145.33 ms ±19.42% 1231.18 ms
  200. # bodyrecursive 0.77 1292.77 ms ±23.20% 1342.22 ms
  201.  
  202. # Comparison:
  203. # map tco no reverse 2.51
  204. # tail 1.84 - 1.36x slower
  205. # list comprehension 1.41 - 1.77x slower
  206. # map with tail and reverse 1.40 - 1.79x slower
  207. # generic_tail fn 1.40 - 1.79x slower
  208. # generic_tail & 1.20 - 2.08x slower
  209. # generic_bodyrecursive fn 0.98 - 2.54x slower
  210. # generic_bodyrecursive & 0.90 - 2.79x slower
  211. # stdlib & 0.88 - 2.86x slower
  212. # stdlib fn 0.87 - 2.87x slower
  213. # bodyrecursive 0.77 - 3.24x slower
  214.  
  215.  
  216.  
  217. # ------------------------------------------------------------------------------
  218.  
  219.  
  220.  
  221. # Erlang/OTP 19 [erts-8.2] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]
  222. # Elixir 1.4.1
  223. # Benchmark suite executing with the following configuration:
  224. # warmup: 2.0s
  225. # time: 5.0s
  226. # parallel: 1
  227. # inputs: 1-Small 1 Thousand, 2-Middle 100 Thousand, 3-Big 10 Million
  228. # Estimated total run time: 231.0s
  229.  
  230.  
  231. # Benchmarking with input 1-Small 1 Thousand:
  232. # Benchmarking bodyrecursive...
  233. # Benchmarking generic_bodyrecursive &...
  234. # Benchmarking generic_bodyrecursive fn...
  235. # Benchmarking generic_tail &...
  236. # Benchmarking generic_tail fn...
  237. # Benchmarking list comprehension...
  238. # Benchmarking map tco no reverse...
  239. # Benchmarking map with tail and reverse...
  240. # Benchmarking stdlib &...
  241. # Benchmarking stdlib fn...
  242. # Benchmarking tail...
  243.  
  244. # Benchmarking with input 2-Middle 100 Thousand:
  245. # Benchmarking bodyrecursive...
  246. # Benchmarking generic_bodyrecursive &...
  247. # Benchmarking generic_bodyrecursive fn...
  248. # Benchmarking generic_tail &...
  249. # Benchmarking generic_tail fn...
  250. # Benchmarking list comprehension...
  251. # Benchmarking map tco no reverse...
  252. # Benchmarking map with tail and reverse...
  253. # Benchmarking stdlib &...
  254. # Benchmarking stdlib fn...
  255. # Benchmarking tail...
  256.  
  257. # Benchmarking with input 3-Big 10 Million:
  258. # Benchmarking bodyrecursive...
  259. # Benchmarking generic_bodyrecursive &...
  260. # Benchmarking generic_bodyrecursive fn...
  261. # Benchmarking generic_tail &...
  262. # Benchmarking generic_tail fn...
  263. # Benchmarking list comprehension...
  264. # Benchmarking map tco no reverse...
  265. # Benchmarking map with tail and reverse...
  266. # Benchmarking stdlib &...
  267. # Benchmarking stdlib fn...
  268. # Benchmarking tail...
  269. # Generated report_1_-_small_-_1_thousand.html
  270. # Generated report_2_-_middle_-_100_thousand.html
  271. # Generated report_3_-_big_-_10_million.html
  272.  
  273. # ##### With input 1-Small 1 Thousand #####
  274. # Name ips average deviation median
  275. # tail 75.77 K 13.20 μs ±192.88% 12.00 μs
  276. # generic_bodyrecursive & 59.03 K 16.94 μs ±86.31% 15.00 μs
  277. # bodyrecursive 58.86 K 16.99 μs ±52.39% 15.00 μs
  278. # generic_bodyrecursive fn 55.99 K 17.86 μs ±131.17% 15.00 μs
  279. # stdlib fn 31.56 K 31.69 μs ±176.10% 29.00 μs
  280. # stdlib & 30.89 K 32.37 μs ±66.49% 29.00 μs
  281. # list comprehension 30.83 K 32.44 μs ±160.79% 31.00 μs
  282. # generic_tail & 28.86 K 34.65 μs ±64.41% 33.00 μs
  283. # map tco no reverse 28.77 K 34.75 μs ±49.77% 33.00 μs
  284. # generic_tail fn 28.55 K 35.03 μs ±57.88% 33.00 μs
  285. # map with tail and reverse 26.55 K 37.67 μs ±57.48% 36.00 μs
  286.  
  287. # Comparison:
  288. # tail 75.77 K
  289. # generic_bodyrecursive & 59.03 K - 1.28x slower
  290. # bodyrecursive 58.86 K - 1.29x slower
  291. # generic_bodyrecursive fn 55.99 K - 1.35x slower
  292. # stdlib fn 31.56 K - 2.40x slower
  293. # stdlib & 30.89 K - 2.45x slower
  294. # list comprehension 30.83 K - 2.46x slower
  295. # generic_tail & 28.86 K - 2.63x slower
  296. # map tco no reverse 28.77 K - 2.63x slower
  297. # generic_tail fn 28.55 K - 2.65x slower
  298. # map with tail and reverse 26.55 K - 2.85x slower
  299.  
  300. # ##### With input 2-Middle 100 Thousand #####
  301. # Name ips average deviation median
  302. # generic_bodyrecursive & 570.31 1.75 ms ±15.47% 1.70 ms
  303. # bodyrecursive 568.73 1.76 ms ±14.63% 1.70 ms
  304. # generic_bodyrecursive fn 568.31 1.76 ms ±15.54% 1.70 ms
  305. # tail 500.11 2.00 ms ±37.82% 1.94 ms
  306. # stdlib & 309.28 3.23 ms ±13.17% 3.07 ms
  307. # stdlib fn 304.57 3.28 ms ±13.54% 3.13 ms
  308. # map tco no reverse 300.33 3.33 ms ±13.53% 3.17 ms
  309. # list comprehension 273.91 3.65 ms ±24.43% 3.45 ms
  310. # generic_tail & 259.20 3.86 ms ±22.43% 3.65 ms
  311. # generic_tail fn 258.28 3.87 ms ±22.23% 3.68 ms
  312. # map with tail and reverse 241.47 4.14 ms ±21.75% 3.91 ms
  313.  
  314. # Comparison:
  315. # generic_bodyrecursive & 570.31
  316. # bodyrecursive 568.73 - 1.00x slower
  317. # generic_bodyrecursive fn 568.31 - 1.00x slower
  318. # tail 500.11 - 1.14x slower
  319. # stdlib & 309.28 - 1.84x slower
  320. # stdlib fn 304.57 - 1.87x slower
  321. # map tco no reverse 300.33 - 1.90x slower
  322. # list comprehension 273.91 - 2.08x slower
  323. # generic_tail & 259.20 - 2.20x slower
  324. # generic_tail fn 258.28 - 2.21x slower
  325. # map with tail and reverse 241.47 - 2.36x slower
  326.  
  327. # ##### With input 3-Big 10 Million #####
  328. # Name ips average deviation median
  329. # map tco no reverse 2.14 466.34 ms ±20.14% 437.61 ms
  330. # tail 2.13 468.99 ms ±38.22% 396.29 ms
  331. # list comprehension 1.56 639.71 ms ±31.52% 644.18 ms
  332. # map with tail and reverse 1.42 703.56 ms ±30.40% 700.50 ms
  333. # generic_tail fn 1.29 777.66 ms ±27.21% 714.83 ms
  334. # generic_tail & 1.15 872.69 ms ±21.90% 923.20 ms
  335. # generic_bodyrecursive & 1.07 933.02 ms ±33.35% 1066.12 ms
  336. # bodyrecursive 1.04 960.28 ms ±31.39% 1051.07 ms
  337. # generic_bodyrecursive fn 1.04 960.88 ms ±32.64% 1090.40 ms
  338. # stdlib fn 1.03 970.59 ms ±30.63% 1176.81 ms
  339. # stdlib & 1.00 998.24 ms ±33.43% 1187.14 ms
  340.  
  341. # Comparison:
  342. # map tco no reverse 2.14
  343. # tail 2.13 - 1.01x slower
  344. # list comprehension 1.56 - 1.37x slower
  345. # map with tail and reverse 1.42 - 1.51x slower
  346. # generic_tail fn 1.29 - 1.67x slower
  347. # generic_tail & 1.15 - 1.87x slower
  348. # generic_bodyrecursive & 1.07 - 2.00x slower
  349. # bodyrecursive 1.04 - 2.06x slower
  350. # generic_bodyrecursive fn 1.04 - 2.06x slower
  351. # stdlib fn 1.03 - 2.08x slower
  352. # stdlib & 1.00 - 2.14x slower
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement