observer.js 5.6 KB

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