Skip to content
This repository has been archived by the owner on Nov 26, 2018. It is now read-only.

Commit

Permalink
perf: improve perf and fix benchmarks
Browse files Browse the repository at this point in the history
Closes #55
  • Loading branch information
gregberge committed Feb 9, 2017
1 parent 775154c commit adff377
Show file tree
Hide file tree
Showing 11 changed files with 311 additions and 327 deletions.
1 change: 0 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@
"rxjs": "^5.0.0-rc.4"
},
"dependencies": {
"change-emitter": "^0.1.2",
"fbjs": "^0.8.8",
"hoist-non-react-statics": "^1.2.0",
"object.omit": "^2.0.1",
Expand Down
422 changes: 211 additions & 211 deletions src/__benchmarks__/README.md

Large diffs are not rendered by default.

48 changes: 8 additions & 40 deletions src/__benchmarks__/complexComponent.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,15 @@ const createComponent = ({
defaultProps,
withState,
withProps,
renameProp,
}) => {
const LibComponent = compose(
setDisplayName('foo'),
pure,
defaultProps({ foo: 'bar' }),
withState('counter', 'updateCounter', 0),
pure,
withProps(({ counter }) => ({ counter: counter + 1 })),
renameProp('updateCounter', 'up'),
pure,
)(() => <div />)

const ComponentWrapper = class extends React.Component {
Expand Down Expand Up @@ -53,7 +53,6 @@ function cleanup() {
}


const Nothing = () => null
const Recompacted = createComponent(recompact)
const Recomposed = createComponent(recompose)
const Reassembled = createComponent(reassemble)
Expand All @@ -63,89 +62,58 @@ let count
series([
() => new Promise(resolve => setTimeout(resolve, 1000)),
() => runBenchmark([
{
description: 'nothing',
onComplete() {
cleanup()
},
run() {
render(<Nothing />)
},
},
{
description: '❤️ recompact',
onComplete() {
cleanup()
},
run() {
render(<Recompacted />)
cleanup()
},
},
{
description: '💙 recompose',
onComplete() {
cleanup()
},
run() {
render(<Recomposed />)
cleanup()
},
},
{
description: '💚 reassemble',
onComplete() {
cleanup()
},
run() {
render(<Reassembled />)
cleanup()
},
},
], '[mount]'),
() => runBenchmark([
{
description: 'nothing',
onStart() {
render(<Nothing />)
count = 0
},
run() {
Nothing.setProps({ foo: count++ })
},
},
{
description: '❤️ recompact',
onStart() {
cleanup()
render(<Recompacted />)
count = 0
},
onComplete() {
cleanup()
},
run() {
Recompacted.setProps({ foo: count++ })
},
},
{
description: '💙 recompose',
onStart() {
cleanup()
render(<Recomposed />)
count = 0
},
onComplete() {
cleanup()
},
run() {
Recomposed.setProps({ foo: count++ })
},
},
{
description: '💚 reassembled',
onStart() {
cleanup()
render(<Reassembled />)
count = 0
},
onComplete() {
cleanup()
},
run() {
Reassembled.setProps({ foo: count++ })
},
Expand Down
1 change: 0 additions & 1 deletion src/__benchmarks__/operators.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import { benchOperator, series } from './utils'

series([
() => new Promise(resolve => setTimeout(resolve, 1000)),
() => benchOperator('defaultProps', { foo: 'bar' }),
() => benchOperator('flattenProp', 'foo'),
() => benchOperator('mapProps', ({ n }) => n + 1),
Expand Down
73 changes: 20 additions & 53 deletions src/__benchmarks__/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,10 @@ const TIME_BETWEEN = 1000
export const series = promises =>
promises.reduce((current, next) => current.then(next), Promise.resolve())

Benchmark.options.initCount = 10
Benchmark.options.queued = true
Benchmark.options.async = true
Benchmark.options.minSamples = 1
Benchmark.options.maxTime = 1
// Benchmark.options.queued = true
// Benchmark.options.async = true
// Benchmark.options.minSamples = 1
// Benchmark.options.maxTime = 0.3

export const runBenchmark = (benchs, name) =>
new Promise((resolve) => {
Expand Down Expand Up @@ -126,128 +125,104 @@ export const benchOperator = (operator, ...args) => {
() => runBenchmark([
{
description: '-- nothing',
onComplete() {
cleanup()
},
run() {
render(<Nothing />)
cleanup()
},
},
{
description: '❤️ recompact',
onComplete() {
cleanup()
},
run() {
render(<RecompactComponent n={0} />)
cleanup()
},
},
{
description: '💙 recompose',
onComplete() {
cleanup()
},
run() {
render(<RecomposeComponent n={0} />)
cleanup()
},
},
{
description: '💚 reassemble',
onComplete() {
cleanup()
},
run() {
render(<ReassembleComponent n={0} />)
cleanup()
},
},
], `[mount][single] ${operator}`),
() => runBenchmark([
{
description: '-- nothing',
onComplete() {
cleanup()
},
run() {
render(<Nothing />)
cleanup()
},
},
{
description: '❤️ recompact',
onComplete() {
cleanup()
},
run() {
render(<RecompactComposedComponent n={0} />)
cleanup()
},
},
{
description: '💙 recompose',
onComplete() {
cleanup()
},
run() {
render(<RecomposeComposedComponent n={0} />)
cleanup()
},
},
{
description: '💚 reassemble',
onComplete() {
cleanup()
},
run() {
render(<ReassembleComposedComponent n={0} />)
cleanup()
},
},
], `[mount][composed] ${operator}`),
() => runBenchmark([
{
description: '-- nothing',
onStart: () => {
cleanup()
render(<NothingWrapper />)
resetCount()
},
onComplete() {
cleanup()
},
run() {
NothingWrapper.setProps({ n: count++ })
},
},
{
description: '❤️ recompact',
onStart: () => {
cleanup()
render(<RecompactWrapper />)
resetCount()
},
onComplete() {
cleanup()
},
run() {
RecompactWrapper.setProps({ n: count++ })
},
},
{
description: '💙 recompose',
onStart: () => {
cleanup()
render(<RecomposeWrapper />)
resetCount()
},
onComplete() {
cleanup()
},
run() {
RecomposeWrapper.setProps({ n: count++ })
},
},
{
description: '💚 reassemble',
onStart: () => {
cleanup()
render(<ReassembleWrapper />)
resetCount()
},
onComplete() {
cleanup()
},
run() {
ReassembleWrapper.setProps({ n: count++ })
},
Expand All @@ -257,51 +232,43 @@ export const benchOperator = (operator, ...args) => {
{
description: '-- nothing',
onStart: () => {
cleanup()
render(<NothingWrapper />)
resetCount()
},
onComplete() {
cleanup()
},
run() {
NothingWrapper.setProps({ n: count++ })
},
},
{
description: '❤️ recompact',
onStart: () => {
cleanup()
render(<RecompactComposedWrapper />)
resetCount()
},
onComplete() {
cleanup()
},
run() {
RecompactComposedWrapper.setProps({ n: count++ })
},
},
{
description: '💙 recompose',
onStart: () => {
cleanup()
render(<RecomposeComposedWrapper />)
resetCount()
},
onComplete() {
cleanup()
},
run() {
RecomposeComposedWrapper.setProps({ n: count++ })
},
},
{
description: '💚 reassemble',
onStart: () => {
cleanup()
render(<ReassembleComposedWrapper />)
resetCount()
},
onComplete() {
cleanup()
},
run() {
ReassembleComposedWrapper.setProps({ n: count++ })
},
Expand Down
16 changes: 9 additions & 7 deletions src/defaultProps.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/* eslint-disable no-shadow, no-restricted-syntax, no-param-reassign */
import createHelper from './createHelper'
import createEagerFactory from './createEagerFactory'
import withProps from './withProps'
import mapProps from './mapProps'
import createCompactableHOC from './utils/createCompactableHOC'

/**
Expand All @@ -17,14 +17,16 @@ import createCompactableHOC from './utils/createCompactableHOC'
* <Button /> // will render <button type="button" />
*/
const defaultProps = defaultProps => createCompactableHOC(
withProps((props) => {
const newProps = { ...props }
for (const propName in defaultProps) {
if (props[propName] === undefined) {
newProps[propName] = defaultProps[propName]
mapProps((props) => {
const newProps = {}
const propKeys = Object.keys(defaultProps)
for (let i = 0; i < propKeys.length; i += 1) {
const propKey = propKeys[i]
if (props[propKey] === undefined) {
newProps[propKey] = defaultProps[propKey]
}
}
return newProps
return { ...props, ...newProps }
}),
(BaseComponent) => {
const factory = createEagerFactory(BaseComponent)
Expand Down
4 changes: 1 addition & 3 deletions src/setConfig.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
import createSymbol from './utils/createSymbol'

let config = {
observablesKey: createSymbol('observables'),
observablesKey: 'observables',
}

/**
Expand Down

0 comments on commit adff377

Please sign in to comment.