PageRenderTime 40ms CodeModel.GetById 9ms RepoModel.GetById 0ms app.codeStats 0ms

/benchmark/rubinius/bm_string.rb

http://github.com/rubinius/rubinius
Ruby | 590 lines | 452 code | 120 blank | 18 comment | 12 complexity | 6556960afceb006f2158373f4635d3a0 MD5 | raw file
Possible License(s): BSD-3-Clause, MPL-2.0-no-copyleft-exception, 0BSD, GPL-2.0, LGPL-2.1
  1. ###############################################################
  2. # bench_string.rb
  3. #
  4. # Benchmark suite for the String class and all its methods.
  5. ###############################################################
  6. require "benchmark"
  7. if ARGV[0] == "-e"
  8. @to_run = ARGV[1].split("||")
  9. elsif ARGV[0] == "-x"
  10. @to_ignore = ARGV[1].split("||")
  11. end
  12. # While MAX is a sort of base loop count, all the benches
  13. # have been scaled with factors to have approximately the
  14. # same magnitude run time.
  15. MAX = (ENV['TOTAL'] || 1_000).to_i
  16. # Not a realistic string, but it is a random string with
  17. # 3% punctuation, 5% digits, 8% upper case, 13% space,
  18. # 71% lower case, shuffled to perfection, then overlayed
  19. # with 4 \n just to confuse everything.
  20. STRING = "rdnqsp uxq\nhnokjirs\nb c6rlh|4c@jcb av8\nPvunszwijhy lz kdgy7hlKlR nzqxg\ndqldeg nm-yg vmnb mk gdrn x"
  21. Benchmark.bmbm do |x|
  22. @x = x
  23. def run(title, &blk)
  24. run_it = false
  25. if @to_run
  26. run_it = true if @to_run.include?(title)
  27. end
  28. if @to_ignore
  29. run_it = true if !@to_ignore.include?(title)
  30. end
  31. run_it = true if !@to_run && !@to_ignore
  32. if run_it
  33. @x.report(title, &blk)
  34. end
  35. end
  36. run("base") {
  37. (MAX*1.0).to_i.times { STRING }
  38. }
  39. run("String.new") {
  40. (MAX*6.3).to_i.times { String.new(STRING) }
  41. }
  42. run("String#%") {
  43. string = "%05d"
  44. number = 123
  45. (MAX*2.6).to_i.times { string % number }
  46. }
  47. run("String#*") {
  48. (MAX*4.5).to_i.times { STRING * 3 }
  49. }
  50. run("String#+") {
  51. (MAX*5.6).to_i.times { STRING + STRING }
  52. }
  53. run("String#<<") {
  54. string = STRING.dup
  55. a = rand(STRING.size/2)
  56. string1 = string[a, STRING.size/2]
  57. (MAX*10.4).to_i.times { string << string1 }
  58. }
  59. run("String#<=>") {
  60. string1 = STRING
  61. string2 = STRING.reverse
  62. (MAX*14.2).to_i.times { string1 <=> string2 }
  63. }
  64. run("String#==") {
  65. string1 = STRING
  66. string2 = STRING.reverse
  67. (MAX*14.5).to_i.times { string1 == string2 }
  68. }
  69. run("String#===") {
  70. string1 = STRING
  71. string2 = STRING.reverse
  72. (MAX*10.8).to_i.times { string1 === string2 }
  73. }
  74. run("String#=~") {
  75. (MAX*5.6).to_i.times { STRING =~ /\w+/ }
  76. }
  77. run("String#[int]") {
  78. (MAX*7.5).to_i.times { STRING[rand(STRING.size)] }
  79. }
  80. run("String#[int,int]") {
  81. a = rand(STRING.size/2)
  82. (MAX*6.5).to_i.times { STRING[a, 15] }
  83. }
  84. run("String#[range]") {
  85. a = rand(STRING.size/2)
  86. b = a + 15
  87. (MAX*1.9).to_i.times { STRING[a..b] }
  88. }
  89. run("String#[regexp]") {
  90. (MAX*3.3).to_i.times { STRING[/\w+/] }
  91. }
  92. run("String#[regexp,int]") {
  93. (MAX*5.1).to_i.times { STRING[/\w+/, 5] }
  94. }
  95. run("String#[string]") {
  96. (MAX*6.2).to_i.times { STRING["lo"] }
  97. }
  98. # TODO: Fix
  99. #run("String#~") {
  100. # string = "hello"
  101. # (MAX*).to_i.times { ~ string }
  102. #}
  103. run("String#capitalize") {
  104. (MAX*3.5).to_i.times { STRING.capitalize }
  105. }
  106. run("String#capitalize!") {
  107. string = STRING
  108. (MAX*3.5).to_i.times { string.dup.capitalize! }
  109. }
  110. run("String#casecmp") {
  111. string1 = STRING
  112. string2 = STRING.reverse
  113. (MAX*17.9).to_i.times { string1.casecmp(string2) }
  114. }
  115. run("String#center") {
  116. a = STRING.size*2
  117. (MAX*7.2).to_i.times { STRING.center(a) }
  118. }
  119. run("String#chomp") {
  120. string = STRING + "\n"
  121. (MAX*7.2).to_i.times { string.chomp }
  122. }
  123. run("String#chomp!") {
  124. string = STRING + "\n"
  125. (MAX*4.1).to_i.times { string.dup.chomp! }
  126. }
  127. run("String#chop") {
  128. (MAX*6.9).to_i.times { STRING.chop }
  129. }
  130. run("String#chop!") {
  131. string = STRING
  132. (MAX*5.3).to_i.times { string.dup.chop! }
  133. }
  134. run("String#count(string)") {
  135. a = rand(STRING.size/2) - 5
  136. string = STRING[a,5]
  137. (MAX*3.9).to_i.times { STRING.count(string) }
  138. }
  139. run("String#count(^string)") {
  140. a = rand(STRING.size/2) - 5
  141. string = "^" + STRING[a,5]
  142. (MAX*3.9).to_i.times { STRING.count(string) }
  143. }
  144. run("String#crypt") {
  145. (MAX*0.3).to_i.times { STRING.crypt("sh") }
  146. }
  147. run("String#delete") {
  148. a = rand(STRING.size/2) - 15
  149. string = STRING[a, 15]
  150. (MAX*1.8).to_i.times { STRING.delete(string) }
  151. }
  152. run("String#delete!") {
  153. a = rand(STRING.size/2) - 15
  154. string = STRING[a, 15]
  155. (MAX*1.7).to_i.times { STRING.dup.delete!(string) }
  156. }
  157. run("String#downcase") {
  158. (MAX*4.4).to_i.times { STRING.downcase }
  159. }
  160. run("String#downcase!") {
  161. (MAX*3.5).to_i.times { STRING.dup.downcase! }
  162. }
  163. run("String#dump") {
  164. (MAX*1.5).to_i.times { STRING.dump }
  165. }
  166. run("String#dup") {
  167. (MAX*6.1).to_i.times { STRING.dup }
  168. }
  169. run("String#each") {
  170. (MAX*1.4).to_i.times { STRING.each { |e| } }
  171. }
  172. run("String#each_byte") {
  173. (MAX*0.2).to_i.times { STRING.each_byte { |e| } }
  174. }
  175. run("String#empty?") {
  176. (MAX*18.5).to_i.times { STRING.empty? }
  177. }
  178. run("String#eql?") {
  179. string1= STRING
  180. string2= STRING.reverse
  181. (MAX*17.7).to_i.times { string1.eql?(string2) }
  182. }
  183. run("String#gsub(regexp, repl)") {
  184. (MAX*0.6).to_i.times { STRING.dup.gsub(/[aeiou]/, '*') }
  185. }
  186. run("String#gsub(regexp) { block }") {
  187. (MAX*0.02).to_i.times { STRING.dup.gsub(/./) { |s| } }
  188. }
  189. run("String#gsub!(regexp) { block }") {
  190. (MAX*0.02).to_i.times { STRING.dup.gsub!(/./) { |s| } }
  191. }
  192. run("String#hex") {
  193. string = "0x"
  194. 8.to_i.times { string << rand(16).to_s(16) }
  195. (MAX*7.4).to_i.times { string.hex }
  196. }
  197. run("String#include?") {
  198. (MAX*6.3).to_i.times { STRING.include?("lo") }
  199. }
  200. run("String#index(string)") {
  201. (MAX*6.9).to_i.times { STRING.index("e") }
  202. }
  203. run("String#index(string, offset)") {
  204. a = rand(STRING.size/2)
  205. (MAX*8.8).to_i.times { STRING.index("e", -a) }
  206. }
  207. run("String#index(int)") {
  208. a = rand(STRING.size)
  209. (MAX*10.9).to_i.times { STRING.index(a) }
  210. }
  211. run("String#index(int, offset)") {
  212. a = rand(STRING.size/2)
  213. b = rand(STRING.size/2)
  214. (MAX*8.5).to_i.times { STRING.index(a, -b) }
  215. }
  216. run("String#index(regexp)") {
  217. (MAX*4.6).to_i.times { STRING.index(/[aeiou]/) }
  218. }
  219. run("String#index(regexp, offset)") {
  220. a = rand(STRING.size/2)
  221. (MAX*6.0).to_i.times { STRING.index(/[aeiou]/, -a) }
  222. }
  223. run("String#insert") {
  224. a = rand(STRING.size/2)
  225. (MAX*4.8).to_i.times { STRING.dup.insert(a, "world") }
  226. }
  227. run("String#inspect") {
  228. (MAX*1.2).to_i.times { STRING.inspect }
  229. }
  230. run("String#intern") {
  231. string = STRING * (((MAX*11.6).to_i / STRING.size) + 2)
  232. (MAX*0.1).to_i.times { string.chop!.intern }
  233. }
  234. run("String#length") {
  235. (MAX*18.4).to_i.times { STRING.length }
  236. }
  237. run("String#ljust") {
  238. a = STRING.size*2
  239. (MAX*7.4).to_i.times { STRING.ljust(a) }
  240. }
  241. run("String#lstrip") {
  242. string = (" " * 10) + STRING
  243. (MAX*5.8).to_i.times { string.lstrip }
  244. }
  245. run("String#lstrip!") {
  246. string = (" " * 10) + STRING
  247. (MAX*21.0).to_i.times { string.lstrip! }
  248. }
  249. run("String#match(regexp)") {
  250. (MAX*4.8).to_i.times { STRING.match(/lo/) }
  251. }
  252. run("String#match(string)") {
  253. (MAX*4.5).to_i.times { STRING.match("lo") }
  254. }
  255. run("String#oct") {
  256. string = "0"
  257. 8.to_i.times { string << rand(8).to_s }
  258. (MAX*13.0).to_i.times { string.oct }
  259. }
  260. run("String#replace") {
  261. string = ""
  262. 8.to_i.times { string << STRING[rand(STRING.size)] }
  263. (MAX*5.2).to_i.times { STRING.dup.replace(string) }
  264. }
  265. run("String#reverse") {
  266. (MAX*9.0).to_i.times { STRING.reverse }
  267. }
  268. run("String#reverse!") {
  269. (MAX*5.5).to_i.times { STRING.dup.reverse! }
  270. }
  271. run("String#rindex(string)") {
  272. (MAX*6.4).to_i.times { STRING.rindex("e") }
  273. }
  274. run("String#rindex(string, int)") {
  275. a = rand(STRING.size/2)
  276. (MAX*6.8).to_i.times { STRING.rindex("e", a) }
  277. }
  278. run("String#rindex(int, int)") {
  279. a = rand(STRING.size/2)
  280. b = rand(STRING.size/2)
  281. (MAX*12.0).to_i.times { STRING.rindex(a, b) }
  282. }
  283. run("String#rindex(regexp)") {
  284. (MAX*4.5).to_i.times { STRING.rindex(/[aeiou]/) }
  285. }
  286. run("String#rindex(regexp, int)") {
  287. a = rand(STRING.size/2)
  288. (MAX*6.3).to_i.times { STRING.rindex(/[aeiou]/, a) }
  289. }
  290. run("String#rjust(width)") {
  291. a = STRING.size*2
  292. (MAX*4.5).to_i.times { STRING.rjust(a) }
  293. }
  294. run("String#rjust(width, padding)") {
  295. a = STRING.size*2
  296. (MAX*4.8).to_i.times { STRING.rjust(a, "-") }
  297. }
  298. run("String#rstrip") {
  299. string = STRING + (" " * 10)
  300. (MAX*9.3).to_i.times { string.rstrip }
  301. }
  302. run("String#rstrip!") {
  303. string = STRING + (" " * 10)
  304. (MAX*20.1).to_i.times { string.rstrip! }
  305. }
  306. run("String#scan") {
  307. (MAX*0.3).to_i.times { STRING.scan(/\w+/) }
  308. }
  309. run("String#scan { block }") {
  310. (MAX*0.1).to_i.times { STRING.scan(/\w+/) { |w| } }
  311. }
  312. run("String#slice(int)") {
  313. a = rand(STRING.size/2)
  314. (MAX*7.1).to_i.times { STRING.dup.slice(a) }
  315. }
  316. run("String#slice(int, int)") {
  317. a = rand(STRING.size/2)
  318. b = rand(STRING.size/2)
  319. (MAX*9.7).to_i.times { STRING.slice(a, b) }
  320. }
  321. run("String#slice(range)") {
  322. a = rand(STRING.size/2)
  323. b = rand(STRING.size/2)
  324. (MAX*2.0).to_i.times { STRING.slice(a..b) }
  325. }
  326. run("String#slice(regexp)") {
  327. (MAX*6.9).to_i.times { STRING.slice(/ell/) }
  328. }
  329. run("String#slice(string)") {
  330. (MAX*3.3).to_i.times { STRING.slice("lo") }
  331. }
  332. run("String#split") {
  333. (MAX*0.6).to_i.times { STRING.split }
  334. }
  335. run("String#split(string)") {
  336. string = STRING.dup
  337. 10.to_i.times { string[rand(STRING.size)] = "-" }
  338. (MAX*0.4).to_i.times { string.split("-") }
  339. }
  340. run("String#split(string, limit)") {
  341. string = STRING.dup
  342. 10.to_i.times { string[rand(STRING.size)] = "-" }
  343. a = rand(5)
  344. (MAX*1.6).to_i.times { string.split("-", a) }
  345. }
  346. run("String#split(regexp)") {
  347. string = STRING.dup
  348. 10.to_i.times { string[rand(STRING.size)] = "-" }
  349. (MAX*0.2).to_i.times { string.split(/\w+/) }
  350. }
  351. run("String#split(regexp, limit)") {
  352. string = STRING.dup
  353. 10.to_i.times { string[rand(STRING.size)] = "-" }
  354. a = rand(5)
  355. (MAX*0.2).to_i.times { string.split(/\w+/, a) }
  356. }
  357. run("String#squeeze") {
  358. string = STRING.dup
  359. 20.to_i.times { string[rand(STRING.size)] = " " }
  360. (MAX*5.3).to_i.times { string.squeeze }
  361. }
  362. run("String#squeeze(char)") {
  363. string = STRING.dup
  364. 20.to_i.times { string[rand(STRING.size)] = " " }
  365. (MAX*3.1).to_i.times { string.squeeze(" ") }
  366. }
  367. run("String#squeeze('m-n')") {
  368. string = STRING.dup
  369. (MAX*1.9).to_i.times { string.squeeze("m-z") }
  370. }
  371. run("String#squeeze!") {
  372. string = STRING.dup
  373. 20.to_i.times { string[rand(STRING.size)] = " " }
  374. (MAX*3.9).to_i.times { string.dup.squeeze! }
  375. }
  376. run("String#squeeze!(char)") {
  377. string = STRING.dup
  378. 20.to_i.times { string[rand(STRING.size)] = " " }
  379. (MAX*2.5).to_i.times { string.dup.squeeze!(" ") }
  380. }
  381. run("String#squeeze!('m-n')") {
  382. (MAX*2.4).to_i.times { STRING.dup.squeeze!("m-z") }
  383. }
  384. run("String#strip") {
  385. string = (" " * 10) + STRING + (" " * 10)
  386. (MAX*7.8).to_i.times { string.strip }
  387. }
  388. run("String#strip!") {
  389. string = (" " * 10) + STRING + (" " * 10)
  390. (MAX*9.1).to_i.times { string.strip! }
  391. }
  392. run("String#sub(pattern, repl)") {
  393. (MAX*3.6).to_i.times { STRING.sub(/[aeiou]/, '*') }
  394. }
  395. run("String#sub(pattern) { block }") {
  396. (MAX*2.1).to_i.times { STRING.sub(/./) { |s| } }
  397. }
  398. run("String#sub!(pattern, repl)") {
  399. (MAX*3.2).to_i.times { STRING.dup.sub!(/[aeiou]/, '*') }
  400. }
  401. run("String#sub!(pattern) { block }") {
  402. (MAX*2.2).to_i.times { STRING.dup.sub!(/./) { |s| } }
  403. }
  404. run("String#succ") {
  405. (MAX*10.4).to_i.times { STRING.succ }
  406. }
  407. run("String#succ!") {
  408. (MAX*4.8).to_i.times { STRING.dup.succ! }
  409. }
  410. run("String#sum") {
  411. (MAX*9.1).to_i.times { STRING.sum }
  412. }
  413. run("String#sum(int)") {
  414. (MAX*10.7).to_i.times { STRING.sum(8) }
  415. }
  416. run("String#swapcase") {
  417. (MAX*2.3).to_i.times { STRING.swapcase }
  418. }
  419. run("String#swapcase!") {
  420. (MAX*2.0).to_i.times { STRING.dup.swapcase! }
  421. }
  422. run("String#to_f") {
  423. string = "123.45"
  424. (MAX*13.6).to_i.times { string.to_f }
  425. }
  426. run("String#to_i") {
  427. string = "12345"
  428. (MAX*11.7).to_i.times { string.to_i }
  429. }
  430. run("String#to_i(base)") {
  431. string = "12345"
  432. (MAX*13.2).to_i.times { string.to_i(8) }
  433. }
  434. run("String#to_s") {
  435. (MAX*18.1).to_i.times { STRING.to_s }
  436. }
  437. run("String#to_str") {
  438. (MAX*18.5).to_i.times { STRING.to_str }
  439. }
  440. run("String#to_sym") {
  441. string = STRING.reverse * (((MAX*11.6).to_i / STRING.size) + 1)
  442. (MAX*1.0).to_i.times { string.chop!.to_sym }
  443. }
  444. run("String#tr") {
  445. (MAX*4.8).to_i.times { STRING.tr("el", "ip") }
  446. }
  447. run("String#tr!") {
  448. (MAX*3.7).to_i.times { STRING.dup.tr!("el", "ip") }
  449. }
  450. run("String#tr_s") {
  451. (MAX*4.1).to_i.times { STRING.tr_s("l", "r") }
  452. }
  453. run("String#tr_s!") {
  454. (MAX*3.3).to_i.times { STRING.dup.tr_s!("l", "r") }
  455. }
  456. # TODO: Add more variations for String#unpack
  457. run("String#unpack") {
  458. (MAX*1.9).to_i.times { STRING.unpack("A5") }
  459. }
  460. run("String#upcase") {
  461. (MAX*2.3).to_i.times { STRING.upcase }
  462. }
  463. run("String#upcase!") {
  464. (MAX*1.7).to_i.times { STRING.dup.upcase! }
  465. }
  466. run("String#upto") {
  467. string = "a1"
  468. (MAX*0.4).to_i.times { string.upto("b6") { |s| } }
  469. }
  470. end