Skip to content

Instantly share code, notes, and snippets.

@vsemozhetbyt
Created November 25, 2016 03:30
Show Gist options
  • Select an option

  • Save vsemozhetbyt/076a0f47779ebf89bc01dca6198ac484 to your computer and use it in GitHub Desktop.

Select an option

Save vsemozhetbyt/076a0f47779ebf89bc01dca6198ac484 to your computer and use it in GitHub Desktop.
Test Node.js buffer zeroing scheme
/******************************************************************************/
'use strict';
/******************************************************************************/
const fs = require('fs');
const cp = require('child_process');
const rl = require('readline');
/******************************************************************************/
const bufSize = 128;
const fileSizeLimit = 256;
const changeSycleSize = 8;
const numberOfTests = 10;
const modes = {
newBuffer: {
code: `console.log([...new Buffer(${bufSize})].reduce((a,v,i)=>\`\${a}\${v?\`\${i} \`:''}\`,''));\n`,
scriptFileName: 'new-buffer.js',
scriptFile: fs.openSync('new-buffer.js', 'w'),
statFile: fs.openSync('new-buffer.log', 'w'),
previousStat: '',
},
allocUnsafe: {
code: `console.log([...Buffer.allocUnsafe(${bufSize})].reduce((a,v,i)=>\`\${a}\${v?\`\${i} \`:''}\`,''));\n`,
scriptFileName: 'alloc-unsafe.js',
scriptFile: fs.openSync('alloc-unsafe.js', 'w'),
statFile: fs.openSync('alloc-unsafe.log', 'w'),
previousStat: '',
},
allocUnsafeSlow: {
code: `console.log([...Buffer.allocUnsafeSlow(${bufSize})].reduce((a,v,i)=>\`\${a}\${v?\`\${i} \`:''}\`,''));\n`,
scriptFileName: 'alloc-unsafe-slow.js',
scriptFile: fs.openSync('alloc-unsafe-slow.js', 'w'),
statFile: fs.openSync('alloc-unsafe-slow.log', 'w'),
previousStat: '',
},
newSlowBuffer: {
code: `console.log([...new require('buffer').SlowBuffer(${bufSize})].reduce((a,v,i)=>\`\${a}\${v?\`\${i} \`:''}\`,''));\n`,
scriptFileName: 'new-slow-buffer.js',
scriptFile: fs.openSync('new-slow-buffer.js', 'w'),
statFile: fs.openSync('new-slow-buffer.log', 'w'),
previousStat: '',
},
alloc: {
code: `console.log([...Buffer.alloc(${bufSize})].reduce((a,v,i)=>\`\${a}\${v?\`\${i} \`:''}\`,''));\n`,
scriptFileName: 'alloc.js',
scriptFile: fs.openSync('alloc.js', 'w'),
statFile: fs.openSync('alloc.log', 'w'),
previousStat: '',
},
};
const maxCodeLength = Math.max(...Object.values(modes).map(mode => mode.code.length));
const remainder = maxCodeLength % changeSycleSize;
const minCodeLengthInSycleStart =
remainder === 1 ? maxCodeLength : maxCodeLength + changeSycleSize - remainder + 1;
Object.values(modes).forEach((mode) => {
mode.code += ' '.repeat(minCodeLengthInSycleStart - mode.code.length);
});
/******************************************************************************/
Object.entries(modes).forEach(([modeName, mode], i) => {
fs.writeSync(mode.scriptFile, mode.code);
for (let codeSize = mode.code.length; codeSize <= fileSizeLimit; codeSize++) {
info(`${i + 1}. ${modeName}: ${codeSize} bytes in file from ${fileSizeLimit}`);
const stats = getStats(numberOfTests, mode.scriptFileName);
const statsAverage = getStatsAverage(stats);
if (statsAverage !== mode.previousStat) {
fs.writeSync(mode.statFile,
`${(codeSize - 1) % changeSycleSize === 0 ? ' ' : '* '}${codeSize}: ${statsAverage}\n`
);
mode.previousStat = statsAverage;
}
fs.writeSync(mode.scriptFile, ' ');
}
});
info('Completed.\n');
/******************************************************************************/
function getStats(numberOfRepetitions, scriptFileName) {
return new Array(numberOfRepetitions).fill('').map(() =>
cp.execSync(`node ${scriptFileName}`).toString().trim()
);
}
/******************************************************************************/
function getStatsAverage(stats) {
const mostRepeatedEntryIndex = stats
.map((stat1, i) => [i, stats.filter(stat2 => stat2 === stat1).length])
.sort((a, b) => b[1] - a[1])[0][0];
return stats[mostRepeatedEntryIndex];
}
/******************************************************************************/
function info(message) {
rl.cursorTo(process.stdout, 0);
rl.clearLine(process.stdout, 0);
process.stdout.write(message);
}
/******************************************************************************/
@vsemozhetbyt
Copy link
Copy Markdown
Author

new-slow-buffer.log

  105: 0 2 8 16 17 18 19 20 24 25 26 32 80 81 82 88 89 90 96 97 98 99
* 108: 0 2 3 4 8 9 10 16 24 25 26 32 56 57 58 64 80 81 82 83 84 85 86 87 92 100 104 114 120 121 122 123
* 109: 0 2 8 16 17 18 19 20 24 25 26 32 80 81 82 88 89 90 96 97 98 99
* 111: 0 2 3 4 8 9 10 16 24 25 26 32 56 57 58 64 80 81 82 83 84 85 86 87 92 100 104 114 120 121 122 123
* 112: 0 2 8 16 17 18 19 20 24 25 26 32 80 81 82 88 89 90 96 97 98 99 112 113 114 115 116 117 118 119
  113: 0 2 8 16 17 18 19 20 24 25 26 32 81 82 88 89 90 96 97 98 99 112 113 114 115 116 117 118 119
* 114: 0 2 8 16 17 18 19 20 24 25 26 32 80 81 82 88 89 90 96 97 98 99
* 115: 0 2 3 8 12 13 17 18 19 20 21 22 23 24 25 26 27 28 29 33 34 38 39 40 41 42 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 66 67 72 76 77 81 82 83 84 85 86 92 93 94 95 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 122 126 127
* 116: 0 2 8 16 17 18 19 20 24 25 26 32 80 81 82 88 89 90 96 97 98 99
* 119: 0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98 100 102 104 106 108 110 112 114 116 118 120 122 124 126
* 120: 0 2 8 16 17 18 19 20 24 25 26 32 80 81 82 88 89 90 96 97 98 99 112 113 114 115 116 117 118 119
  121: 0 2 8 16 17 18 19 20 24 25 26 32 80 81 82 88 89 90 96 97 98 99
* 122: 0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98 100 102 104 106 108 110 112 114 116 118 120 122 124 126
* 123: 0 2 8 16 17 18 19 20 24 25 26 32 80 81 82 88 89 90 96 97 98 99 112 113 114 115 116 117 118 119
* 124: 0 2 8 16 17 18 19 20 24 25 26 32 80 81 82 88 89 90 96 97 98 99
* 130: 0 2 8 16 17 18 19 20 24 25 26 32 80 81 82 88 89 90 96 97 98 99 112 113 114 115 116 117 118 119
* 131: 0 2 8 16 17 18 19 20 24 25 26 32 80 81 82 88 89 90 96 97 98 99
* 138: 0 2 8 9 10 16 17 18 24 25 26 32 33 34 40 41 42 48 49 50 56 57 58 64 65 66 72 73 74 80 81 82 88 89 90 96 97 98 104 105 106 112 113 114 120 121 122
* 139: 0 2 8 16 17 18 19 20 25 26 32 80 81 82 88 89 90 96 97 98 99
* 140: 0 2 8 16 17 18 19 20 24 25 26 32 80 81 82 88 89 90 96 97 98 99
* 141: 0 2 8 16 17 18 19 20 24 25 26 32 80 81 82 88 89 90 96 97 98 99 112 113 114 115 116 117 118 119
* 142: 0 2 8 16 17 18 19 20 24 25 26 32 80 81 82 88 89 90 96 97 98 99
* 143: 0 2 3 4 8 9 10 16 24 25 26 32 56 57 58 64 80 81 82 83 84 85 86 87 92 100 104 114 120 121 122 123
* 144: 0 2 8 16 17 18 19 20 24 25 26 32 80 81 82 88 89 90 96 97 98 99
* 147: 0 2 3 8 16 17 18 19 20 24 25 26 27 32 80 81 82 83 88 89 90 91 96 97 98 99 112 113 114 115 116 117 118 119
* 148: 0 2 8 16 17 18 19 20 24 25 26 32 80 81 82 88 89 90 96 97 98 99
* 149: 0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98 100 102 104 106 108 110 112 114 116 118 120 122 124 126
* 150: 0 2 8 16 17 18 19 20 24 25 26 32 80 81 82 88 89 90 96 97 98 99 112 113 114 115 116 117 118 119
* 151: 0 2 8 16 17 18 19 20 25 26 32 80 81 82 88 89 90 96 97 98 99
* 152: 0 2 8 16 17 18 19 20 24 25 26 32 80 81 82 88 89 90 96 97 98 99
* 155: 0 2 3 8 16 17 18 19 20 24 25 26 27 32 80 81 82 83 88 89 90 96 97 98 99
* 156: 0 2 8 16 17 18 19 20 24 25 26 32 80 81 82 88 89 90 96 97 98 99 112 113 114 115 116 117 118 119
* 158: 0 2 8 16 17 18 19 20 24 25 26 32 80 81 82 88 89 90 96 97 98 99
* 159: 0 2 3 8 12 13 17 18 19 20 21 22 23 24 25 26 27 28 29 33 34 38 39 40 41 42 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 66 67 72 76 77 81 82 83 84 85 86 92 93 94 95 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 122 126 127
* 160: 0 2 8 16 17 18 19 20 24 25 26 32 80 81 82 88 89 90 96 97 98 99
* 167: 0
* 168: 0 2 3 8 16 17 18 19 20 24 25 26 27 32 80 81 82 83 88 89 90 91 96 97 98 99 112 113 114
  169: 0 2 8 16 17 18 19 20 24 25 26 32 80 81 82 88 89 90 96 97 98 99
* 172: 0 2 8 16 17 18 19 20 24 25 26 32 80 81 82 88 89 90 96 97 98 99 112 113 114 115 116 117 118 119
* 173: 0 2 8 16 17 18 19 20 24 25 26 32 80 81 82 88 89 90 96 97 98 99
* 174: 0 2 8 9 10 16 17 18 24 25 26 32 33 34 41 42 48 49 50 56 57 58 64 65 66 72 73 74 80 81 82 88 89 90 96 97 98 104 105 106 112 113 114 120 121 122
* 175: 0 2 8 16 17 18 19 20 24 25 26 32 80 81 82 88 89 90 96 97 98 99
* 176: 0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98 100 102 104 106 108 110 112 114 116 118 120 122 124 126
  177: 0 2 8 16 17 18 19 20 24 25 26 32 80 81 82 88 89 90 96 97 98 99
* 178: 0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98 100 102 104 106 108 110 112 114 116 118 120 122 124 126
* 179: 0 2 8 16 17 18 19 20 24 25 26 32 80 81 82 88 89 90 96 97 98 99
* 182: 0 2 8 9 10 16 17 18 24 25 26 32 33 34 41 42 48 49 50 56 57 58 64 65 66 72 73 74 80 81 82 88 89 90 96 97 98 104 105 106 112 113 114 120 121 122
* 183: 0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40
* 184: 0 2 8 16 17 18 19 20 24 25 26 32 80 81 82 88 89 90 96 97 98 99
* 190: 0 2 8 16 17 18 19 20 24 25 26 32 80 81 82 88 89 90 96 97 98 99 112 113 114 115 116 117 118 119
* 191: 0 2 8 16 17 18 19 20 24 25 26 32 80 81 82 88 89 90 96 97 98 99
* 192: 0 2 3 8 16 17 18 19 20 24 25 26 27 32 80 81 82 83 88 89 90 91 96 97 98 99 112 113 114 115 116 117 118 119
  193: 0 2 8 16 17 18 19 20 24 25 26 32 80 81 82 88 89 90 96 97 98 99
* 194: 0 2 8 16 17 18 19 20 24 25 26 32 80 81 82 88 89 90 96 97 98 99 112 113 114 115 116 117 118 119
* 195: 0 2 8 16 17 18 19 20 24 25 26 32 80 81 82 88 89 90 96 97 98 99
* 196: 0 2 8 16 17 18 19 20 24 25 26 32 80 81 82 88 89 90 96 97 98 99 100 101 112 113 114 115 116 117 120 121 122
* 197: 0 2 8 16 17 18 19 20 24 25 26 32 80 81 82 88 89 90 96 97 98 99
* 198: 0 2 3 8 16 17 18 19 20 24 25 26 27 32 80 81 82 83 88 89 90 91 96 97 98 99 112 113 114
* 199: 0 2 8 16 17 18 19 20 24 25 26 32 80 81 82 88 89 90 96 97 98 99
* 200: 0 2 8 16 17 18 19 20 24 25 26 32 80 81 82 88 89 90 96 97 98 99 112 113 114
  201: 0 2 8 16 17 18 19 20 24 25 26 32 80 81 82 88 89 90 96 97 98 99
* 204: 0 2 8 9 10 16 17 18 24 25 26 32 33 34 41 42 48 49 50 56 57 58 64 65 66 72 73 74 80 81 82 88 89 90 96 97 98 104 105 106 112 113 114 120 121 122
* 205: 0 2 8 16 17 18 19 20 24 25 26 32 80 81 82 88 89 90 96 97 98 99
* 208: 0 2 3 8 16 17 18 19 20 24 25 26 27 32 80 81 82 83 88 89 90 91 96 97 98 99 112 113 114 115 116 117 118 119
  209: 0 2 8 16 17 18 19 20 24 25 26 32 80 81 82 88 89 90 96 97 98 99
* 210: 0 2 8 16 17 18 19 20 24 25 26 32 80 81 82 88 89 90 96 97 98 99 112 113 114 115 116 117 118 119
* 212: 0
* 213: 0 2 8 16 17 18 19 20 24 25 26 32 80 81 82 88 89 90 96 97 98 99
* 214: 0 2 3 8 16 17 18 19 20 24 25 26 27 32 80 81 82 83 88 89 90 96 97 98 99
* 215: 0 2 8 16 17 18 19 20 24 25 26 32 80 81 82 88 89 90 96 97 98 99
* 219: 0 2 3 4 8 9 10 16 24 25 26 32 56 57 58 64 80 81 82 83 84 85 86 87 92 100 104 114 120 121 122 123
* 220: 0 2 8 16 17 18 19 20 24 25 26 32 80 81 82 88 89 90 96 97 98 99
* 223: 0 2 8 16 17 18 19 20 24 25 26 32 81 82 88 89 90 96 97 98 99 112 113 114 115 116 117 118 119
* 224: 0 2 8 16 17 18 19 20 24 25 26 32 80 81 82 88 89 90 96 97 98 99
* 226: 0 2 8 16 17 18 19 20 24 25 26 32 80 81 82 88 89 90 96 97 98 99 112 113 114 115 116 117 118 119
* 227: 0 2 8 9 10 16 17 18 24 25 26 32 33 34 40 41 42 48 49 50 56 57 58 64 65 66 72 73 74 80 81 82 89 90 96 97 98 104 105 106 112 113 114 120 121 122
* 228: 0 2 8 16 17 18 19 20 24 25 26 32 80 81 82 88 89 90 96 97 98 99
* 237: 0 2 3 4 8 9 10 16 24 25 26 32 56 57 58 64 80 81 82 83 84 85 86 87 92 100 104 114 120 121 122 123
* 238: 0 2 8 16 17 18 19 20 24 25 26 32 80 81 82 88 89 90 96 97 98 99 112 113 114 115 116 117 118 119
* 239: 0 2 8 16 17 18 19 20 24 25 26 32 80 81 82 88 89 90 96 97 98 99 112 116 117
* 240: 0 2 8 16 17 18 19 20 24 25 26 32 80 81 82 88 89 90 96 97 98 99 112 113 114 115 116 117 118 119
* 242: 0 2 8 16 17 18 19 20 24 25 26 32 80 81 82 88 89 90 96 97 98 99
* 246: 0 2 8 16 17 18 19 20 24 25 26 32 81 82 88 89 90 96 97 98 99 112 113 114 115 116 117 118 119
* 247: 0 2 8 16 17 18 19 20 24 25 26 32 80 81 82 88 89 90 96 97 98 99
* 250: 0 2 8 16 17 18 19 20 24 25 26 32 80 81 82 88 89 90 96 97 98 99 112 113 114 115 116 117 118 119
* 251: 0 2 8 16 17 18 19 20 24 25 26 32 80 81 82 88 89 90 96 97 98 99
* 252: 0 2 3 4 8 9 10 16 24 25 26 32 56 57 58 64 80 81 82 83 84 85 86 87 92 100 104 114 120 121 122 123
* 253: 0 2 3 8 16 17 18 19 20 24 25 26 27 32 80 81 82 83 88 89 90 91 96 97 98 99 112 113 114
* 254: 0 2 8 16 17 18 19 20 24 25 26 32 80 81 82 88 89 90 96 97 98 99 112 120
* 255: 0 2 8 16 17 18 19 20 24 25 26 32 80 81 82 88 89 90 96 97 98 99

@vsemozhetbyt
Copy link
Copy Markdown
Author

alloc-unsafe-slow.log

  105: 0 2 16 17 18 24 25 26 40 41 42 48 49 50 64 65 66 72 73 74 88 89 90 96 97 98 99 112 113 114 120 121 122
* 111: 0 2 16 17 18 25 26 40 41 42 48 49 50 64 65 66 72 73 74 88 89 90 96 97 98 99 112 113 114 120 121 122
* 112: 0 2 16 17 18 24 25 26 40 41 42 48 49 50 64 65 66 72 73 74 88 89 90 96 97 98 99 112 113 114 120 121 122
* 118: 0 2 16 17 18 24 25 26 40 41 42 48 49 50 64 65 66 72 73 74 88 89 90 96 97 98 99 112 113 114 120 122
* 119: 0 2 16 17 18 24 25 26 40 41 42 48 49 50 64 65 66 72 73 74 88 89 90 96 97 98 99 112 113 114 120 121 122
* 143: 0 2 16 17 18 24 25 26 40 41 42 48 49 50 64 65 66 72 73 74 80 81 82 88 89 90 96 97 98 99 112 113 114 120 121 122
* 151: 0 6 7 8 12 13 14 15 16 17 18 19 20 21 25 26 30 31 32 33 34 35 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 62 63 64 65 69 70 71 72 73 74 75 79 80 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 109 113 114 118 119 120 121 122 123 124 125 126 127
* 152: 0 2 16 17 18 24 25 26 40 41 42 48 49 50 64 65 66 72 73 74 80 81 82 88 89 90 96 97 98 99 112 113 114 120 121 122
* 171: 0 2 3 16 17 18 19 24 25 26 27 40 41 42 43 48 49 50 51 64 65 66 67 72 73 74 75 80 81 82 83 88 89 90 91 96 97 98 99 112 113 114 115 120 121 122 123
* 172: 0 2 16 17 18 24 25 26 40 41 42 48 49 50 64 65 66 72 73 74 80 81 82 88 89 90 96 97 98 99 112 113 114 120 121 122
* 202: 0 2 16 17 18 25 26 40 41 42 48 49 50 64 65 66 72 73 74 80 81 82 88 89 90 96 97 98 99 112 113 114 120 121 122
* 203: 0 2 3 16 17 18 19 24 25 26 27 40 41 42 43 48 49 50 51 64 65 66 67 72 73 74 75 80 81 82 83 88 89 90 91 96 97 98 99 112 113 114 115 120 121 122 123
* 204: 0 2 16 17 18 24 25 26 40 41 42 48 49 50 64 65 66 72 73 74 80 81 82 88 89 90 96 97 98 99 112 113 114 120 121 122

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment