observer.js 5.7 KB

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