Guest User

Untitled

a guest
Nov 2nd, 2018
213
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.00 KB | None | 0 0
  1. require 'benchmark'
  2. require 'active_record'
  3.  
  4. # $ docker run --rm -p 5432:5432 -e POSTGRES_PASSWORD=password -d postgres:9.6
  5. # $ psql -h localhost -U postgres -d postgres
  6. ActiveRecord::Base.establish_connection(
  7. adapter: 'postgresql',
  8. encoding: 'unicode',
  9. host: 'localhost',
  10. database: 'postgres',
  11. username: 'postgres',
  12. password: 'password',
  13. )
  14.  
  15. MEMBER_SIZE = 100
  16. KEYS = Array.new(MEMBER_SIZE, &:to_s)
  17. VALUE = 'a' * 100
  18.  
  19. Type = Struct.new('Type', *KEYS)
  20.  
  21. ActiveRecord::Base.connection.create_table(:benchmark, id: false, force: true) do |t|
  22. MEMBER_SIZE.times { |i| t.string i.to_s }
  23. end
  24.  
  25. class Model < ActiveRecord::Base
  26. self.table_name = 'benchmark'
  27. end
  28.  
  29. hash = KEYS.each_with_object({}) { |k, m| m[k] = VALUE }
  30. struct = Type.new(*KEYS)
  31. ar = Model.new(hash)
  32.  
  33. N = 100_000
  34. Benchmark.bm(20) do |x|
  35. x.report('Hash') do
  36. N.times do
  37. KEYS.each { |key| hash[key] }
  38. end
  39. end
  40.  
  41. x.report('Struct') do
  42. N.times do
  43. KEYS.each { |key| struct[key] }
  44. end
  45. end
  46.  
  47. x.report('ActiveRecord') do
  48. N.times do
  49. KEYS.each { |key| ar[key] }
  50. end
  51. end
  52. end
  53.  
  54. SIZE = 10_000
  55.  
  56. puts ''
  57. puts '### Array<Hash> 10,000'
  58. puts ''
  59. puts `ps u #{$$}`
  60. array_hash = Array.new(SIZE) { KEYS.each_with_object({}) { |k, m| m[k] = VALUE } }
  61. puts `ps u #{$$}`
  62. puts ''
  63. puts '### Array<Struct> 10,000'
  64. puts ''
  65. puts `ps u #{$$}`
  66. array_struct = Array.new(SIZE) { Type.new(*KEYS) }
  67. puts `ps u #{$$}`
  68. puts ''
  69. puts '### Array<ActiveRecord::Base> 10,000'
  70. puts ''
  71. puts `ps u #{$$}`
  72. array_ar = Array.new(SIZE) { Model.new(hash) }
  73. puts `ps u #{$$}`
  74.  
  75. __END__
  76.  
  77. ruby 2.5.3p105 (2018-10-18 revision 65156) [x86_64-linux]
  78.  
  79. user system total real
  80. Hash 1.055541 0.000745 1.056286 ( 1.057475)
  81. Struct 1.994870 0.002425 1.997295 ( 2.003269)
  82. ActiveRecord 8.106248 0.009364 8.115612 ( 8.150399)
  83.  
  84. ### Array<Hash> 10,000
  85.  
  86. USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
  87. koshigoe 35281 100.0 0.6 4506992 99012 ?? Ss 7:32AM 0:11.53 benchmark-hash-vs-struct-vs-ar.rb
  88. USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
  89. koshigoe 35281 100.0 0.8 4505968 138700 ?? Ss 7:32AM 0:11.88 benchmark-hash-vs-struct-vs-ar.rb
  90.  
  91. ### Array<Struct> 10,000
  92.  
  93. USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
  94. koshigoe 35281 100.0 0.8 4505968 138700 ?? Ss 7:32AM 0:11.89 benchmark-hash-vs-struct-vs-ar.rb
  95. USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
  96. koshigoe 35281 100.0 0.9 4520304 146052 ?? Ss 7:32AM 0:11.90 benchmark-hash-vs-struct-vs-ar.rb
  97.  
  98. ### Array<ActiveRecord::Base> 10,000
  99.  
  100. USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
  101. koshigoe 35281 100.0 0.9 4520304 146052 ?? Ss 7:32AM 0:11.90 benchmark-hash-vs-struct-vs-ar.rb
  102. USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
  103. koshigoe 35281 100.0 2.5 4788280 412972 ?? Ss 7:32AM 0:18.81 benchmark-hash-vs-struct-vs-ar.rb
Add Comment
Please, Sign In to add comment