UNPKG

5.2 kBJavaScriptView Raw
1/* eslint-disable import/no-commonjs, class-methods-use-this */
2
3const os = require('os');
4const Benchmark = require('benchmark');
5const React = require('react');
6const ReactDomServer = require('react-dom/server');
7const ReactCssModulesComponent = require('react-css-modules');
8const getClassName = require('../dist/browser/getClassName').default;
9
10const minSamples = 100;
11
12// eslint-disable-next-line no-process-env
13if (process.env.NODE_ENV !== 'production') {
14 throw new Error('Unexpected NODE_ENV.');
15}
16
17/**
18 * @see https://github.com/petkaantonov/bluebird/blob/4ec337233c1fa7bb4eb90473222014f16d074e58/benchmark/performance.js#L11
19 */
20const printPlatform = () => {
21 const v8 = process.versions.v8;
22 const node = process.versions.node;
23
24 // eslint-disable-next-line no-process-env
25 const plat = os.type() + ' ' + os.release() + ' ' + os.arch() + '\nNode.JS ' + node + '\nV8 ' + v8 + '\nNODE_ENV=' + process.env.NODE_ENV;
26
27 let cpus = os.cpus()
28 .map((cpu) => {
29 return cpu.model;
30 })
31 .reduce((o, model) => {
32 if (!o[model]) {
33 o[model] = 0;
34 }
35
36 o[model]++;
37
38 return o;
39 }, {});
40
41 cpus = Object
42 .keys(cpus)
43 .map((key) => {
44 return key + ' \u00d7 ' + cpus[key];
45 })
46 .join('\n');
47
48 // eslint-disable-next-line no-console
49 console.log('\nPlatform info:\n' + plat + '\n' + cpus + '\n');
50};
51
52const suite = new Benchmark.Suite();
53
54suite.add('Using `className` (base)', () => {
55 const SubjectComponent = React.createClass({
56 render () {
57 return React.createElement(
58 'div',
59 {
60 className: 'foo'
61 },
62 React.createElement('div', {
63 className: 'bar'
64 }),
65 React.createElement('div', {
66 className: 'bar'
67 }),
68 React.createElement('div', {
69 className: 'bar'
70 })
71 );
72 }
73 });
74
75 ReactDomServer.renderToStaticMarkup(React.createElement(SubjectComponent));
76}, {
77 minSamples
78});
79
80suite.add('`react-css-modules`', () => {
81 let SubjectComponent;
82
83 SubjectComponent = React.createClass({
84 render () {
85 return React.createElement(
86 'div',
87 {
88 styleName: 'foo'
89 },
90 React.createElement('div', {
91 styleName: 'bar'
92 }),
93 React.createElement('div', {
94 styleName: 'bar'
95 }),
96 React.createElement('div', {
97 styleName: 'bar'
98 })
99 );
100 }
101 });
102
103 SubjectComponent = ReactCssModulesComponent(SubjectComponent, {
104 bar: 'b',
105 foo: 'a'
106 });
107
108 ReactDomServer.renderToStaticMarkup(React.createElement(SubjectComponent));
109}, {
110 minSamples
111});
112
113suite.add('`babel-plugin-react-css-modules` (runtime, anonymous)', () => {
114 const styleModuleImportMap = {
115 anonymous: {
116 bar: 'b',
117 foo: 'a'
118 }
119 };
120
121 const SubjectComponent = React.createClass({
122 render () {
123 return React.createElement(
124 'div',
125 {
126 className: getClassName('foo', styleModuleImportMap)
127 },
128 React.createElement('div', {
129 className: getClassName('bar', styleModuleImportMap)
130 }),
131 React.createElement('div', {
132 className: getClassName('bar', styleModuleImportMap)
133 }),
134 React.createElement('div', {
135 className: getClassName('bar', styleModuleImportMap)
136 })
137 );
138 }
139 });
140
141 ReactDomServer.renderToStaticMarkup(React.createElement(SubjectComponent));
142}, {
143 minSamples
144});
145
146suite.add('`babel-plugin-react-css-modules` (runtime, named)', () => {
147 const styleModuleImportMap = {
148 qux: {
149 bar: 'b',
150 foo: 'a'
151 }
152 };
153
154 const SubjectComponent = React.createClass({
155 render () {
156 return React.createElement(
157 'div',
158 {
159 className: getClassName('qux.foo', styleModuleImportMap)
160 },
161 React.createElement('div', {
162 className: getClassName('qux.bar', styleModuleImportMap)
163 }),
164 React.createElement('div', {
165 className: getClassName('qux.bar', styleModuleImportMap)
166 }),
167 React.createElement('div', {
168 className: getClassName('qux.bar', styleModuleImportMap)
169 })
170 );
171 }
172 });
173
174 ReactDomServer.renderToStaticMarkup(React.createElement(SubjectComponent));
175}, {
176 minSamples
177});
178
179const results = [];
180
181suite
182 .on('error', (error) => {
183 // eslint-disable-next-line no-console
184 console.log('error', error);
185
186 throw new Error('An unexpected error has occurred.');
187 })
188 .on('cycle', (event) => {
189 results.push(event.target);
190 })
191 .on('complete', () => {
192 const table = [];
193
194 table.push('|Name|Operations per second (relative margin of error)|Sample size|Difference from the base benchmark|');
195 table.push('|---|---|---|---|');
196
197 let base;
198
199 for (const benchmark of results) {
200 if (!base) {
201 base = benchmark;
202 }
203
204 table.push('|' + benchmark.name + '|' + Math.floor(benchmark.hz) + ' (±' + benchmark.stats.rme.toFixed(2) + '%)|' + benchmark.count + '|-' + Math.floor(((base.hz - benchmark.hz) / benchmark.hz) * 100) + '%|');
205 }
206
207 // eslint-disable-next-line no-console
208 console.log(table.join('\n'));
209
210 printPlatform();
211 });
212
213suite.run();