observer.js 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362
  1. var Observer = require('../src/observer/observer')
  2. var Emitter = require('../src/emitter')
  3. var OldObserver = require('../../vue/src/observer')
  4. var sideEffect = true
  5. var runs = 1000
  6. function cb () {
  7. sideEffect = !sideEffect
  8. }
  9. var loadTime = getNano()
  10. function getNano () {
  11. var hr = process.hrtime()
  12. return hr[0] * 1e9 + hr[1]
  13. }
  14. function now () {
  15. return (getNano() - loadTime) / 1e6
  16. }
  17. function bench (desc, fac, run) {
  18. var objs = []
  19. for (var i = 0; i < runs; i++) {
  20. objs.push(fac(i))
  21. }
  22. var s = now()
  23. for (var i = 0; i < runs; i++) {
  24. run(objs[i])
  25. }
  26. var passed = now() - s
  27. console.log(desc + ' - ' + (16 / (passed / runs)).toFixed(2) + ' ops/frame')
  28. }
  29. bench(
  30. 'observe (simple object) ',
  31. function (i) {
  32. return {a:i}
  33. },
  34. function (o) {
  35. new Observer().observe('', o)
  36. }
  37. )
  38. bench(
  39. 'old observe (simple object) ',
  40. function (i) {
  41. return {a:i}
  42. },
  43. function (o) {
  44. OldObserver.observe(o, '', new Emitter())
  45. }
  46. )
  47. bench(
  48. 'observe (3 nested objects) ',
  49. function (i) {
  50. return {a:{b:{c:i}}}
  51. },
  52. function (o) {
  53. new Observer().observe('', o)
  54. }
  55. )
  56. bench(
  57. 'old observe (3 nested objects) ',
  58. function (i) {
  59. return {a:{b:{c:i}}}
  60. },
  61. function (o) {
  62. OldObserver.observe(o, '', new Emitter())
  63. }
  64. )
  65. bench(
  66. 'observe (array, 3 objects) ',
  67. function (i) {
  68. return [{a:i}, {a:i+1}, {a:i+2}]
  69. },
  70. function (o) {
  71. new Observer().observe('', o)
  72. }
  73. )
  74. bench(
  75. 'old observe (array, 3 objects) ',
  76. function (i) {
  77. return [{a:i}, {a:i+1}, {a:i+2}]
  78. },
  79. function (o) {
  80. OldObserver.observe(o, '', new Emitter())
  81. }
  82. )
  83. bench(
  84. 'observe (array, 30 objects) ',
  85. function () {
  86. var a = [], i = 30
  87. while (i--) {
  88. a.push({a:i})
  89. }
  90. return a
  91. },
  92. function (o) {
  93. new Observer().observe('', o)
  94. }
  95. )
  96. bench(
  97. 'old observe (array, 30 objects)',
  98. function () {
  99. var a = [], i = 30
  100. while (i--) {
  101. a.push({a:i})
  102. }
  103. return a
  104. },
  105. function (o) {
  106. OldObserver.observe(o, '', new Emitter())
  107. }
  108. )
  109. Observer.emitGet = true
  110. OldObserver.shouldGet = true
  111. bench(
  112. 'simple get ',
  113. function () {
  114. var a = {a:1}
  115. var ob = new Observer()
  116. ob.observe('', a)
  117. ob.on('get', cb)
  118. return a
  119. },
  120. function (o) {
  121. var v = o.a
  122. }
  123. )
  124. bench(
  125. 'old simple get',
  126. function () {
  127. var a = {a:1}
  128. var ob = new Emitter()
  129. OldObserver.observe(a, '', ob)
  130. ob.on('get', cb)
  131. return a
  132. },
  133. function (o) {
  134. var v = o.a
  135. }
  136. )
  137. bench(
  138. 'nested get ',
  139. function () {
  140. var a = {a:{b:{c:1}}}
  141. var ob = new Observer()
  142. ob.observe('', a)
  143. ob.on('get', cb)
  144. return a
  145. },
  146. function (o) {
  147. var v = o.a.b.c
  148. }
  149. )
  150. bench(
  151. 'old nested get',
  152. function () {
  153. var a = {a:{b:{c:1}}}
  154. var ob = new Emitter()
  155. OldObserver.observe(a, '', ob)
  156. ob.on('get', cb)
  157. return a
  158. },
  159. function (o) {
  160. var v = o.a.b.c
  161. }
  162. )
  163. Observer.emitGet = false
  164. OldObserver.shouldGet = false
  165. bench(
  166. 'simple set ',
  167. function () {
  168. var a = {a:1}
  169. var ob = new Observer()
  170. ob.observe('', a)
  171. ob.on('set', cb)
  172. return a
  173. },
  174. function (o) {
  175. o.a = 12345
  176. }
  177. )
  178. bench(
  179. 'old simple set',
  180. function () {
  181. var a = {a:1}
  182. var ob = new Emitter()
  183. OldObserver.observe(a, '', ob)
  184. ob.on('set', cb)
  185. return a
  186. },
  187. function (o) {
  188. o.a = 12345
  189. }
  190. )
  191. bench(
  192. 'nested set ',
  193. function () {
  194. var a = {a:{b:{c:1}}}
  195. var ob = new Observer()
  196. ob.observe('', a)
  197. ob.on('set', cb)
  198. return a
  199. },
  200. function (o) {
  201. o.a.b.c = 2
  202. }
  203. )
  204. bench(
  205. 'old nested set',
  206. function () {
  207. var a = {a:{b:{c:1}}}
  208. var ob = new Emitter()
  209. OldObserver.observe(a, '', ob)
  210. ob.on('set', cb)
  211. return a
  212. },
  213. function (o) {
  214. o.a.b.c = 2
  215. }
  216. )
  217. bench(
  218. 'swap set ',
  219. function () {
  220. var a = {a:{b:{c:1}}}
  221. var ob = new Observer()
  222. ob.observe('', a)
  223. ob.on('set', cb)
  224. return a
  225. },
  226. function (o) {
  227. o.a = {b:{c:2}}
  228. }
  229. )
  230. bench(
  231. 'old swap set ',
  232. function () {
  233. var a = {a:{b:{c:1}}}
  234. var ob = new Emitter()
  235. OldObserver.observe(a, '', ob)
  236. ob.on('set', cb)
  237. return a
  238. },
  239. function (o) {
  240. o.a = {b:{c:2}}
  241. }
  242. )
  243. bench(
  244. 'array push ',
  245. function () {
  246. var a = []
  247. var ob = new Observer()
  248. ob.observe('', a)
  249. ob.on('mutation', cb)
  250. return a
  251. },
  252. function (o) {
  253. o.push({a:1})
  254. }
  255. )
  256. bench(
  257. 'old array push',
  258. function () {
  259. var a = []
  260. var ob = new Emitter()
  261. OldObserver.observe(a, '', ob)
  262. ob.on('mutation', cb)
  263. return a
  264. },
  265. function (o) {
  266. o.push({a:1})
  267. }
  268. )
  269. bench(
  270. 'array reverse (5 objects) ',
  271. function () {
  272. var a = [], i = 5
  273. while (i--) {
  274. a.push({a:i})
  275. }
  276. var ob = new Observer()
  277. ob.observe('', a)
  278. ob.on('mutation', cb)
  279. return a
  280. },
  281. function (o) {
  282. o.reverse()
  283. }
  284. )
  285. bench(
  286. 'old array reverse (5 objects) ',
  287. function () {
  288. var a = [], i = 5
  289. while (i--) {
  290. a.push({a:i})
  291. }
  292. var ob = new Emitter()
  293. OldObserver.observe(a, '', ob)
  294. ob.on('mutation', cb)
  295. return a
  296. },
  297. function (o) {
  298. o.reverse()
  299. }
  300. )
  301. bench(
  302. 'array reverse (50 objects) ',
  303. function () {
  304. var a = [], i = 50
  305. while (i--) {
  306. a.push({a:i})
  307. }
  308. var ob = new Observer()
  309. ob.observe('', a)
  310. ob.on('mutation', cb)
  311. return a
  312. },
  313. function (o) {
  314. o.reverse()
  315. }
  316. )
  317. bench(
  318. 'old array reverse (50 objects)',
  319. function () {
  320. var a = [], i = 50
  321. while (i--) {
  322. a.push({a:i})
  323. }
  324. var ob = new Emitter()
  325. OldObserver.observe(a, '', ob)
  326. ob.on('mutation', cb)
  327. return a
  328. },
  329. function (o) {
  330. o.reverse()
  331. }
  332. )