Skip to content

Commit

Permalink
Use string concatenation to increase performance
Browse files Browse the repository at this point in the history
  • Loading branch information
jonkoops committed Dec 24, 2023
1 parent 82208a3 commit b4a328e
Show file tree
Hide file tree
Showing 3 changed files with 97 additions and 61 deletions.
21 changes: 8 additions & 13 deletions benchmarks/benchmarks.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
import { Bench } from 'tinybench';

import local from 'classnames-local';
import bind from 'classnames-local/bind.js';
import dedupe from 'classnames-local/dedupe.js';
import localPackage from 'classnames-local/package.json' with { type: 'json' };

import npm from 'classnames-npm';
import npmDedupe from 'classnames-npm/dedupe.js';
import npmBind from 'classnames-npm/bind.js';
import npmPackage from 'classnames-npm/package.json' with { type: 'json' };

if (localPackage.version !== npmPackage.version) {
Expand Down Expand Up @@ -51,21 +53,14 @@ export async function runBenchmarks () {
async function runBenchmark (benchmark) {
const bench = new Bench();

bench.add(`local#${benchmark.description}`, () => {
local(...benchmark.args);
});
bench.add(`default/local`, () => local(...benchmark.args));
bench.add(`default/npm`, () => npm(...benchmark.args));

bench.add(`npm#${benchmark.description}`, () => {
npm(...benchmark.args);
});
bench.add(`bind/local`, () => bind(...benchmark.args));
bench.add(`bind/npm`, () => npmBind(...benchmark.args));

bench.add(`local/dedupe#${benchmark.description}`, () => {
dedupe(...benchmark.args);
});

bench.add(`npm/dedupe#${benchmark.description}`, () => {
npmDedupe(...benchmark.args);
});
bench.add(`dedupe/local`, () => dedupe(...benchmark.args));
bench.add(`dedupe/npm`, () => npmDedupe(...benchmark.args));

await bench.run();
return bench;
Expand Down
65 changes: 44 additions & 21 deletions bind.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,33 +11,56 @@
var hasOwn = {}.hasOwnProperty;

function classNames () {
var classes = [];
var classes = '';

for (var i = 0; i < arguments.length; i++) {
var arg = arguments[i];
if (!arg) continue;

var argType = typeof arg;

if (argType === 'string' || argType === 'number') {
classes.push(this && this[arg] || arg);
} else if (Array.isArray(arg)) {
classes.push(classNames.apply(this, arg));
} else if (argType === 'object') {
if (arg.toString !== Object.prototype.toString && !arg.toString.toString().includes('[native code]')) {
classes.push(arg.toString());
continue;
}

for (var key in arg) {
if (hasOwn.call(arg, key) && arg[key]) {
classes.push(this && this[key] || key);
}
}
if (arg) {
classes = appendClass(classes, parseValue.call(this, arg));
}
}

return classes.join(' ');
return classes;
}

function parseValue (arg) {
if (typeof arg === 'string' || typeof arg === 'number') {
return this && this[arg] || arg;
}

if (typeof arg !== 'object') {
return '';
}

if (Array.isArray(arg)) {
return classNames.apply(this, arg);
}

if (arg.toString !== Object.prototype.toString && !arg.toString.toString().includes('[native code]')) {
return arg.toString();
}

var classes = '';

for (var key in arg) {
if (hasOwn.call(arg, key) && arg[key]) {
classes = appendClass(classes, this && this[key] || key);
}
}

return classes;
}

function appendClass (value, newClass) {
if (!newClass) {
return value;
}

if (value) {
return value + ' ' + newClass;
}

return value + newClass;
}

if (typeof module !== 'undefined' && module.exports) {
Expand Down
72 changes: 45 additions & 27 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,39 +10,57 @@

var hasOwn = {}.hasOwnProperty;

function classNames() {
var classes = [];
function classNames () {
var classes = '';

for (var i = 0; i < arguments.length; i++) {
var arg = arguments[i];
if (!arg) continue;

var argType = typeof arg;

if (argType === 'string' || argType === 'number') {
classes.push(arg);
} else if (Array.isArray(arg)) {
if (arg.length) {
var inner = classNames.apply(null, arg);
if (inner) {
classes.push(inner);
}
}
} else if (argType === 'object') {
if (arg.toString !== Object.prototype.toString && !arg.toString.toString().includes('[native code]')) {
classes.push(arg.toString());
continue;
}

for (var key in arg) {
if (hasOwn.call(arg, key) && arg[key]) {
classes.push(key);
}
}
if (arg) {
classes = appendClass(classes, parseValue(arg));
}
}

return classes.join(' ');
return classes;
}

function parseValue (arg) {
if (typeof arg === 'string' || typeof arg === 'number') {
return arg;
}

if (typeof arg !== 'object') {
return '';
}

if (Array.isArray(arg)) {
return classNames.apply(null, arg);
}

if (arg.toString !== Object.prototype.toString && !arg.toString.toString().includes('[native code]')) {
return arg.toString();
}

var classes = '';

for (var key in arg) {
if (hasOwn.call(arg, key) && arg[key]) {
classes = appendClass(classes, key);
}
}

return classes;
}

function appendClass (value, newClass) {
if (!newClass) {
return value;
}

if (value) {
return value + ' ' + newClass;
}

return value + newClass;
}

if (typeof module !== 'undefined' && module.exports) {
Expand Down

0 comments on commit b4a328e

Please sign in to comment.