Guest User

Untitled

a guest
Feb 21st, 2018
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.93 KB | None | 0 0
  1. ## result
  2. user system total real
  3. apeiros: 0.460000 0.010000 0.470000 ( 0.470928)
  4. nullie: 0.510000 0.000000 0.510000 ( 0.512677)
  5. Loaded suite compare_segments
  6. Started
  7. ..
  8. Finished in 0.003989 seconds.
  9.  
  10. 2 tests, 30 assertions, 0 failures, 0 errors
  11.  
  12.  
  13. ## code
  14. require 'benchmark'
  15. require 'test/unit'
  16.  
  17. $n = 1e3
  18. $tests = [
  19. ["/", "/", "/"],
  20. ["/", "/segment1", "/"],
  21. ["/segment1", "/", "/"],
  22. ["/segment1", "/segment1", "/segment1"],
  23. ["/segment1", "/segment2", "/"],
  24. ["/segment1/segment2", "/segment1/segment2", "/segment1/segment2"],
  25. ["/segment1/segment2", "/segment1/segment2/", "/segment1/segment2"],
  26. ["/segment1/segment2/", "/segment1/segment2", "/segment1/segment2"],
  27. ["/segment1/segment2/", "/segment1/segment2/", "/segment1/segment2"],
  28. ["/segment1/segment2", "/segmentX/segmentY/", "/"],
  29. ["/segment1/segment2/segment3/segment4", "/segment1/segment2/segmentX/segmentY", "/segment1/segment2"],
  30. ["/segment1/segment2/segment3/segment4", "/segment1/segment2/segment3x/segment4", "/segment1/segment2"],
  31. ["/segment1/segment2/segment3/segment4", "/segment1/segment2", "/segment1/segment2"],
  32. ["/segment1/segment2/segment3/segment4", "/segment1/segment2/", "/segment1/segment2"],
  33. [
  34. "/longsegment1/longsegment2/longsegment3/longsegment4/longsegment5/longsegment6/longsegment7/longsegment8/longsegment9",
  35. "/longsegment1/longsegment2/longsegment3/longsegment4/longsegment5/longsegment6/longsegment7/longsegment8/longsegment9",
  36. "/longsegment1/longsegment2/longsegment3/longsegment4/longsegment5/longsegment6/longsegment7/longsegment8/longsegment9",
  37. ]
  38. ]
  39.  
  40. def cs_apeiros(s1,s2)
  41. s1 = s1[1,s1.length].split(/\//)
  42. s2 = s2[1,s2.length].split(/\//)
  43. same = []
  44. s1.length.times { |i| break unless s1[i] == s2[i]; same << s1[i] }
  45. "/"+same.join("/")
  46. end
  47.  
  48. def cs_apeiros(s1,s2)
  49. result = ""
  50. offset = 0
  51. offset2 = nil
  52. s1 = s1.chomp("/")
  53. s1_length = s1.length
  54. s2_length = s2.length
  55. while offset < s1_length
  56. offset2 = s1.index("/", offset+1) || s1_length
  57. length = offset2-offset
  58. segment = s1[offset,length]
  59. break unless (s2[offset,length] == segment && (s2_length == offset2 || s2[offset2] == 47))
  60. result << segment
  61. offset = offset2
  62. end
  63. result == "" ? "/" : result
  64. end
  65.  
  66. def cs_nullie(s1,s2)
  67. s1 = s1[1,s1.length].split(/\//)
  68. s2 = s2[1,s2.length].split(/\//)
  69. r = []
  70. s1.each {|x| break unless x == s2.shift; r << x}
  71. "/"+r.join("/")
  72. end
  73.  
  74. Benchmark.bm(20) { |bm|
  75. bm.report("apeiros:") { $n.to_i.times { $tests.each { |(a,b,r)| cs_apeiros(a,b) } } }
  76. bm.report("nullie:") { $n.to_i.times { $tests.each { |(a,b,r)| cs_nullie(a,b) } } }
  77. }
  78.  
  79. class TestImplementations < Test::Unit::TestCase
  80. def test_apeiros
  81. $tests.each { |(a,b,r)|
  82. assert_equal(r, cs_apeiros(a,b), "#{r} epected for #{a}, #{b}")
  83. }
  84. end
  85.  
  86. def test_nullie
  87. $tests.each { |(a,b,r)|
  88. assert_equal(r, cs_nullie(a,b))
  89. }
  90. end
  91. end
Add Comment
Please, Sign In to add comment