-
Notifications
You must be signed in to change notification settings - Fork 3
/
nodeGzipTester.js
131 lines (103 loc) · 5.42 KB
/
nodeGzipTester.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/*
2010-08-27 jorge@jorgechamorro.com
Node.js:
Program to monitor the behaviour of a gzip child process when its input is fed via stdin in small chunks, vs in a single piece.
See: http://groups.google.com/group/nodejs/browse_thread/thread/b9ba7dd6d0b39bb9#421164b67ed93e59
*/
function rnd (n) { return Math.floor(n* Math.random()) }
var poema= (function () {
//"escribe" un "poema" de aproximadamente length caracteres.
var words= "Con diez cañones por banda viento en popa a toda vela no corta el mar sino vuela un velero bergantín Bajel pirata que llaman por su bravura El Temido en todo mar conocido del uno al otro confín La luna en el mar riela en la lona gime el viento y alza en blando movimiento olas de plata y azul y va el capitán pirata cantando alegre en la popa Asia a un lado al otro Europa y allá a su frente Estambul Navega velero mío sin temor que ni enemigo navío ni tormenta ni bonanza tu rumbo a torcer alcanza ni a sujetar tu valor Veinte presas hemos hecho a despecho del inglés y han rendido sus pendones cien naciones a mis pies Que es mi barco mi tesoro que es mi dios la libertad mi ley la fuerza y el viento mi única patria la mar Allá muevan feroz guerra ciegos reyes por un palmo más de tierra que yo aquí tengo por mío cuanto abarca el mar bravío a quien nadie impuso leyes Y no hay playa sea cualquiera ni bandera de esplendor que no sienta mi derecho y dé pechos mi valor Que es mi barco mi tesoro que es mi dios la libertad mi ley la fuerza y el viento mi única patria la mar A la voz de barco viene es de ver cómo vira y se previene a todo trapo a escapar que yo soy el rey del mar y mi furia es de temer En las presas yo divido lo cogido por igual sólo quiero por riqueza la belleza sin rival Que es mi barco mi tesoro que es mi dios la libertad mi ley la fuerza y el viento mi única patria la mar Sentenciado estoy a muerte Yo me río no me abandone la suerte y al mismo que me condena colgaré de alguna antena quizá en su propio navío Y si caigo qué es la vida Por perdida ya la di cuando el yugo del esclavo como un bravo sacudí Que es mi barco mi tesoro que es mi dios la libertad mi ley la fuerza y el viento mi única patria la mar Son mi música mejor aquilones el estrépito y temblor de los cables sacudidos del negro mar los bramidos y el rugir de mis cañones Y del trueno al son violento y del viento al rebramar yo me duermo sosegado arrullado por el mar Que es mi barco mi tesoro que es mi dios la libertad mi ley la fuerza y el viento mi única patria la mar".toLowerCase().split(" ").filter((function (found) {
return function (v, i, o) {
if (found.indexOf(v) >= 0) return;
else return found.push(v);
};
})([]));
return function poema (length, r, curr, prev) {
r= words[rnd(words.length)];
while (r.length < length) {
do curr= words[rnd(words.length)]; while (curr === prev);
r+= " "+ (prev= curr);
}
return r;
};
})();
function newGzipper () {
//Launches and returns a new gzip child process.
return require('child_process').spawn("gzip",["--stdout","--best"]);
}
/*
Init the input text to be fed to gzip
*/
var chunks= (function (c, txt) {
txt= poema(4096)+ " ";
while (c.push(txt) < (4*1024*1024/txt.length) ) ;
return c;
})([], "");
console.log("\"I\" === input chunks, \"O\" === output chunks.");
console.log("Input text length: "+ chunks.join("").length+ " characters");
/*
Gzip it in small chunks fed to single gzip process
*/
inChunksGOOD= {
gzip: newGzipper(),
outputLen: 0,
trace: "",
chunkIndex: 0
};
inChunksGOOD.gzip.stdout.on('data', function (data) {
inChunksGOOD.outputLen+= data.length;
inChunksGOOD.trace+= "O";
});
inChunksGOOD.gzip.stdout.on('end', function () {
console.log("\nWELL CHUNKED:\nTRACE: "+ inChunksGOOD.trace+ "*END*\nOUTPUT: "+ inChunksGOOD.outputLen+ " bytes");
});
(function chunker () {
//feeds the chunks.
if (inChunksGOOD.chunkIndex < chunks.length) {
inChunksGOOD.gzip.stdin.write(chunks[inChunksGOOD.chunkIndex++], encoding='utf8');
setTimeout(chunker, 1e3/60);
} else {
inChunksGOOD.gzip.stdin.end(chunks[inChunksGOOD.chunkIndex++], encoding='utf8');
}
inChunksGOOD.trace+= "I";
})();
/*
Gzip it in small chunks fed to -many- gzip processes. (BAD, BAD, very bad).
*/
inChunksBAD= {
gzip: null,
outputLen: 0,
trace: "",
chunkIndex: 0
};
(function chunker () {
//feeds the chunks to the gzippers at a rate as fast as possible.
inChunksBAD.gzip= newGzipper();
inChunksBAD.gzip.stdout.on('data', function (data) {
inChunksBAD.outputLen+= data.length;
inChunksBAD.trace+= "O";
});
inChunksBAD.gzip.stdout.on('end', function () {
if (inChunksBAD.chunkIndex < chunks.length) return setTimeout(chunker, 5);
console.log("\nBADLY CHUNKED:\nTRACE: "+ inChunksBAD.trace+ "*END*\nOUTPUT: "+ inChunksBAD.outputLen+ " bytes");
});
inChunksBAD.gzip.stdin.end(chunks[inChunksBAD.chunkIndex++], encoding='utf8');
inChunksBAD.trace+= "I";
})();
/*
And gzip it too in a single piece and with a single gzip process.
*/
inASinglePiece= {
gzip: newGzipper(),
outputLen: 0,
trace: "I"
};
inASinglePiece.gzip.stdout.on('data', function (data) {
inASinglePiece.outputLen+= data.length;
inASinglePiece.trace+= "O";
});
inASinglePiece.gzip.stdout.on('end', function (data) {
console.log("\ninASinglePiece:\nTRACE: "+ inASinglePiece.trace+ "*END*\nOUTPUT: "+ inASinglePiece.outputLen+ " bytes");
});
inASinglePiece.gzip.stdin.end(chunks.join(""), encoding='utf8');