minmax_benchs.html 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524
  1. <!doctype html public "-//w3c//dtd html 4.0 transitional//en">
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
  5. <meta name="GENERATOR" content="Mozilla/4.77 [en] (X11; U; Linux 2.2.19 i686) [Netscape]">
  6. <meta name="Author" content="Herve Bronnimann">
  7. <meta name="Description" content="Small library to propose minmax_element algorithm.">
  8. <title>Boost minmax library</title>
  9. </head>
  10. <body text="#000000" bgcolor="#FFFFFF" link="#0000EE" vlink="#551A8B" alink="#FF0000">
  11. <center>
  12. <h1>
  13. Minmax_element Performance</h1></center>
  14. <h3>
  15. <a NAME="Performance"></a><b>About performance</b></h3>
  16. Of course, there are many factors that affect the performance of an algorithm.
  17. The number of comparison is only one, but also branch prediction, pipelining,
  18. locality of reference (affects cache efficiency), etc. In practice,
  19. we observe that when the iterator type is a pointer,
  20. <tt>boost::minmax_element</tt>
  21. is only a tad slower than
  22. <tt>std::min_element</tt>, and is even faster
  23. than
  24. <tt>boost::first_min_last_max_element</tt>! This is even more true
  25. for slower iterators (<tt>list&lt;>::iterator</tt> or
  26. <tt>map&lt;>iterator</tt>
  27. for instance). The following experiments were conducted on a Pentium III
  28. 500 Mhz running Linux and compiled with g++, version 2.95.2, flags -O3.
  29. In the tables, we use different distributions: <i>Identical</i> means that
  30. all the elements are identical, <i>2-valued</i> means that we replace the
  31. second half of the identical elements by a distinct element, <i>increasing</i>
  32. means that all the elements are distinct and in increasing order, <i>decrea</i>sing
  33. is the reverse, and <i>random</i> is produced by random_shuffle.
  34. <br>
  35. The program that created these tables is included in the distribution,
  36. under <a href="../example/minmax_timer.cpp">minmax_timer.cpp</a>
  37. <br>
  38. <center><table BORDER NOSAVE >
  39. <tr NOSAVE>
  40. <td NOSAVE><b>vector&lt;int>::iterator</b></td>
  41. <td>Identical</td>
  42. <td>2-valued</td>
  43. <td>Increasing</td>
  44. <td>Decreasing</td>
  45. <td>Random</td>
  46. </tr>
  47. <tr>
  48. <td>std::min_element</td>
  49. <td>23.26M/s</td>
  50. <td>23.26M/s</td>
  51. <td>23.15M/s</td>
  52. <td>22.94M/s</td>
  53. <td>22.94M/s</td>
  54. </tr>
  55. <tr>
  56. <td>std::max_element</td>
  57. <td>23.26M/s</td>
  58. <td>23.26M/s</td>
  59. <td>23.15M/s</td>
  60. <td>22.94M/s</td>
  61. <td>22.62M/s</td>
  62. </tr>
  63. <tr>
  64. <td>boost::first_min_element</td>
  65. <td>23.15M/s</td>
  66. <td>23.04M/s</td>
  67. <td>23.04M/s</td>
  68. <td>22.94M/s</td>
  69. <td>22.83M/s</td>
  70. </tr>
  71. <tr>
  72. <td>boost::last_min_element</td>
  73. <td>23.26M/s</td>
  74. <td>23.26M/s</td>
  75. <td>23.26M/s</td>
  76. <td>22.83M/s</td>
  77. <td>16.23M/s</td>
  78. </tr>
  79. <tr>
  80. <td>boost::first_max_element</td>
  81. <td>23.15M/s</td>
  82. <td>23.26M/s</td>
  83. <td>23.15M/s</td>
  84. <td>23.04M/s</td>
  85. <td>22.93M/s</td>
  86. </tr>
  87. <tr>
  88. <td>boost::last_max_element</td>
  89. <td>23.26M/s</td>
  90. <td>23.15M/s</td>
  91. <td>23.15M/s</td>
  92. <td>22.94M/s</td>
  93. <td>16.18M/s</td>
  94. </tr>
  95. <tr>
  96. <td>boost::minmax_element</td>
  97. <td>21.83M/s</td>
  98. <td>21.83M/s</td>
  99. <td>21.83M/s</td>
  100. <td>21.55M/s</td>
  101. <td>17.79M/s</td>
  102. </tr>
  103. <tr>
  104. <td>boost::first_min_last_max_element</td>
  105. <td>18.52M/s</td>
  106. <td>18.38M/s</td>
  107. <td>18.38M/s</td>
  108. <td>18.94M/s</td>
  109. <td>16.29M/s</td>
  110. </tr>
  111. <tr>
  112. <td>boost::last_min_first_max_element</td>
  113. <td>20.08M/s</td>
  114. <td>20.83M/s</td>
  115. <td>20.75M/s</td>
  116. <td>19.76M/s</td>
  117. <td>15.87M/s</td>
  118. </tr>
  119. <tr>
  120. <td>boost::last_min_last_max_element</td>
  121. <td>18.66M/s</td>
  122. <td>19.69M/s</td>
  123. <td>19.69M/s</td>
  124. <td>19.23M/s</td>
  125. <td>15.77M/s</td>
  126. </tr>
  127. <caption ALIGN=BOTTOM>Number of elements per second for standard vector
  128. container iterators</caption>
  129. </table></center>
  130. <center><table BORDER NOSAVE >
  131. <tr NOSAVE>
  132. <td NOSAVE><b>list&lt;int>::iterator</b></td>
  133. <td>Identical</td>
  134. <td>2-valued</td>
  135. <td>Increasing</td>
  136. <td>Decreasing</td>
  137. <td>Random</td>
  138. </tr>
  139. <tr>
  140. <td>std::min_element</td>
  141. <td>5.8M/s</td>
  142. <td>5.8M/s</td>
  143. <td>5.80M/s</td>
  144. <td>5.73M/s</td>
  145. <td>5.73M/s</td>
  146. </tr>
  147. <tr>
  148. <td>std::max_element</td>
  149. <td>5.81M/s</td>
  150. <td>5.81M/s</td>
  151. <td>5.78M/s</td>
  152. <td>5.73M/s</td>
  153. <td>5.75M/s</td>
  154. </tr>
  155. <tr>
  156. <td>boost::first_min_element</td>
  157. <td>5.81M/s</td>
  158. <td>5.81M/s</td>
  159. <td>5.79M/s</td>
  160. <td>5.75M/s</td>
  161. <td>5.73M/s</td>
  162. </tr>
  163. <tr>
  164. <td>boost::last_min_element</td>
  165. <td>5.81M/s</td>
  166. <td>5.80M/s</td>
  167. <td>5.79M/s</td>
  168. <td>5.73M/s</td>
  169. <td>5.03M/s</td>
  170. </tr>
  171. <tr>
  172. <td>boost::first_max_element</td>
  173. <td>5.81M/s</td>
  174. <td>5.80M/s</td>
  175. <td>5.78M/s</td>
  176. <td>5.74M/s</td>
  177. <td>5.73M/s</td>
  178. </tr>
  179. <tr>
  180. <td>boost::last_max_element</td>
  181. <td>5.81M/s</td>
  182. <td>5.80M/s</td>
  183. <td>5.79M/s</td>
  184. <td>5.73M/s</td>
  185. <td>5.07M/s</td>
  186. </tr>
  187. <tr>
  188. <td>boost::minmax_element</td>
  189. <td>5.68M/s</td>
  190. <td>5.80M/s</td>
  191. <td>5.66M/s</td>
  192. <td>5.74M/s</td>
  193. <td>5.30M/s</td>
  194. </tr>
  195. <tr>
  196. <td>boost::first_min_last_max_element</td>
  197. <td>5.79M/s</td>
  198. <td>5.81M/s</td>
  199. <td>5.78M/s</td>
  200. <td>5.73M/s</td>
  201. <td>5.04M/s</td>
  202. </tr>
  203. <tr>
  204. <td>boost::last_min_first_max_element</td>
  205. <td>5.69M/s</td>
  206. <td>5.79M/s</td>
  207. <td>5.69M/s</td>
  208. <td>5.73M/s</td>
  209. <td>4.84M/s</td>
  210. </tr>
  211. <tr>
  212. <td>boost::last_min_last_max_element</td>
  213. <td>5.61M/s</td>
  214. <td>5.79M/s</td>
  215. <td>5.64M/s</td>
  216. <td>5.74M/s</td>
  217. <td>4.75M/s</td>
  218. </tr>
  219. <caption ALIGN=BOTTOM>Runtimes for standard list container iterators</caption>
  220. </table></center>
  221. <center><table BORDER NOSAVE >
  222. <tr NOSAVE>
  223. <td NOSAVE><b>multiset&lt;int>::iterator</b></td>
  224. <td>Identical</td>
  225. <td>2-valued</td>
  226. <td>Increasing</td>
  227. <td>Decreasing</td>
  228. <td>Random</td>
  229. </tr>
  230. <tr>
  231. <td>std::min_element</td>
  232. <td>4.03M/s</td>
  233. <td>4.04M/s</td>
  234. <td>4.02M/s</td>
  235. <td>4.04M/s</td>
  236. <td>2.97M/s</td>
  237. </tr>
  238. <tr>
  239. <td>std::max_element3.007M</td>
  240. <td>4.02M/s</td>
  241. <td>4.02M/s</td>
  242. <td>4.01M/s</td>
  243. <td>4.02M/s</td>
  244. <td>2.96M/s</td>
  245. </tr>
  246. <tr>
  247. <td>boost::first_min_element</td>
  248. <td>4.01M/s</td>
  249. <td>4.04M/s</td>
  250. <td>4.03M/s</td>
  251. <td>4.04M/s</td>
  252. <td>3.01M/s</td>
  253. </tr>
  254. <tr>
  255. <td>boost::last_min_element</td>
  256. <td>4.03M/s</td>
  257. <td>4.04M/s</td>
  258. <td>4.04M/s</td>
  259. <td>4.04M/s</td>
  260. <td>3.00M/s</td>
  261. </tr>
  262. <tr>
  263. <td>boost::first_max_element</td>
  264. <td>4.04M/s</td>
  265. <td>4.04M/s</td>
  266. <td>4.04M/s</td>
  267. <td>4.06M/s</td>
  268. <td>3.01M/s</td>
  269. </tr>
  270. <tr>
  271. <td>boost::last_max_element</td>
  272. <td>4.04M/s</td>
  273. <td>4.04M/s</td>
  274. <td>4.03M/s</td>
  275. <td>4.04M/s</td>
  276. <td>3.00M/s</td>
  277. </tr>
  278. <tr>
  279. <td>boost::minmax_element</td>
  280. <td>3.98M/s</td>
  281. <td>3.99M/s</td>
  282. <td>3.98M/s</td>
  283. <td>3.99M/s</td>
  284. <td>3.00M/s</td>
  285. </tr>
  286. <tr>
  287. <td>boost::first_min_last_max_element</td>
  288. <td>3.99M/s</td>
  289. <td>3.98M/s</td>
  290. <td>3.97M/s</td>
  291. <td>3.99M/s</td>
  292. <td>2.99M/s</td>
  293. </tr>
  294. <tr>
  295. <td>boost::last_min_first_max_element</td>
  296. <td>3.97M/s</td>
  297. <td>3.98M/s</td>
  298. <td>3.96M/s</td>
  299. <td>3.98M/s</td>
  300. <td>3.00M/s</td>
  301. </tr>
  302. <tr>
  303. <td>boost::last_min_last_max_element</td>
  304. <td>4.00M/s</td>
  305. <td>4.00M/s</td>
  306. <td>4.00M/s</td>
  307. <td>4.02M/s</td>
  308. <td>2.97M/s</td>
  309. </tr>
  310. <caption ALIGN=BOTTOM>Runtimes for standard set/multiset container iterators</caption>
  311. </table></center>
  312. <hr SIZE="6">
  313. <br>Last modified 2004-06-28
  314. <p><font face="Arial,Helvetica"><font size=-1>&copy; Copyright Herv&eacute;
  315. Br&ouml;nnimann, Polytechnic University, 2002--2004.
  316. Use, modification, and distribution is subject to the Boost Software
  317. License, Version 1.0. (See accompanying file <a href="../../../../LICENSE_1_0.txt">License_1_0.txt</a> or copy at
  318. <a href="http://www.boost.org/LICENSE_1_0.txt">http://www.boost.org/LICENSE_1_0.txt</a>)
  319. </font></font>
  320. </body>
  321. </html>