HTML Preparation code:
x
 
1
2
<script src='https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js'></script>
Script Preparation code:
 
function randomString() {
  var length = Math.ceil(Math.random() * 100);
  var possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
  var text = '';
  for (var i=0; i < length; i++) {
    text += possible.charAt(Math.floor(Math.random() * possible.length));
  }
  
  return text;  
}
function createObject() {
    return {
        num1: Math.random(),
        num2: Math.random(),
        num3: Math.random(Math.random()),
        str1: randomString(),
        str2: randomString(),
        str3: randomString(),
        bool1: true,
        bool2: false,
        obj1: {
            prop1: randomString(),
            prop2: Math.random(),
            prop3: true,
        },
        obj2: {
            prop1: randomString(),
            prop2: Math.random(),
            prop3: false,
        },
        arr1: [1,2,3,4,5,6,7,8,9,0],
        arr2: [
            randomString(),
            randomString(),
            randomString(),
            randomString(),
            randomString(),
            randomString(),
            randomString(),
        ],
    }
}
collection = Array(1000).fill(0).map(createObject);
Tests:
  • underscorePick1

     
        const mapped = collection.map((data) => ({
            ..._(data).pick('num3', 'str1', 'str2', 'bool2', 'arr1', 'obj1'),
            num1: data.num1 + 10,
            num2: data.num2 + 10,
            str3: data.str3 + '12345',
            bool1: false,
            obj2: { ...data.obj2, prop1: '1212212'},
            arr2: [data.arr2[0], data.arr2[1], data.arr2[2]]
        }));
  • underscorePick2

     
    const mapped = collection.map((data) => ({
            ..._.pick(data, 'num3', 'str1', 'str2', 'bool2', 'arr1', 'obj1'),
            num1: data.num1 + 10,
            num2: data.num2 + 10,
            str3: data.str3 + '12345',
            bool1: false,
            obj2: { ...data.obj2, prop1: '1212212'},
            arr2: [data.arr2[0], data.arr2[1], data.arr2[2]]
        }));
  • underscoreOmit1

     
    const mapped = collection.map((data) => ({
            ..._(data).omit('num1', 'num2', 'str3', 'bool1', 'obj2', 'arr2'),
            num1: data.num1 + 10,
            num2: data.num2 + 10,
            str3: data.str3 + '12345',
            bool1: false,
            obj2: { ...data.obj2, prop1: '1212212'},
            arr2: [data.arr2[0], data.arr2[1], data.arr2[2]]
        }));
  • underscoreOmit2

     
    const mapped = collection.map((data) => ({
            ..._.omit(data, 'num1', 'num2', 'str3', 'bool1', 'obj2', 'arr2'),
            num1: data.num1 + 10,
            num2: data.num2 + 10,
            str3: data.str3 + '12345',
            bool1: false,
            obj2: { ...data.obj2, prop1: '1212212'},
            arr2: [data.arr2[0], data.arr2[1], data.arr2[2]]
        }));
  • objectUnion

     
    const mapped = collection.map((data) => ({
            ...data,
            num1: data.num1 + 10,
            num2: data.num2 + 10,
            str3: data.str3 + '12345',
            bool1: false,
            obj2: { ...data.obj2, prop1: '1212212'},
            arr2: [data.arr2[0], data.arr2[1], data.arr2[2]]
        }));
  • objectCreate

     
    const mapped = collection.map((data) => ({
            num1: data.num1 + 10,
            num2: data.num2 + 10,
            num3: data.num3,
            str1: data.str1,
            str2: data.str2,
            str3: data.str3 + '12345',
            bool1: false,
            bool2: data.bool2,
            obj1: data.obj1,
            obj2: { ...data.obj2, prop1: '1212212'},
            arr1: data.arr1,
            arr2: [data.arr2[0], data.arr2[1], data.arr2[2]]
        }));
  • objectUpdate

     
    const mapped = collection.map((data) => {
            data.num1 += 10;
            data.num2 += 10;
            data.str3 += '12345';
            data.bool1 = false;
            data.obj2.prop1 = '1212212';
            data.arr2.length = 3;
            return data;
        });
Rendered benchmark preparation results:

Suite status: <idle, ready to run>

Previous results

Experimental features:

  • Test case name Result
    underscorePick1
    underscorePick2
    underscoreOmit1
    underscoreOmit2
    objectUnion
    objectCreate
    objectUpdate

    Fastest: N/A

    Slowest: N/A

Latest run results:
Run details: (Test run date: 9 months ago)
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36
Chrome 113 on Linux
View result in a separate tab
Test name Executions per second
underscorePick1 246.3 Ops/sec
underscorePick2 221.8 Ops/sec
underscoreOmit1 208.9 Ops/sec
underscoreOmit2 150.3 Ops/sec
objectUnion 9197.8 Ops/sec
objectCreate 11407.9 Ops/sec
objectUpdate 9338.0 Ops/sec