fs: improve readFile performance · nodejs/node@eb2d416 (original) (raw)
`@@ -6,27 +6,32 @@ const { Buffer } = require('buffer');
`
6
6
``
7
7
`const { FSReqCallback, close, read } = internalBinding('fs');
`
8
8
``
9
``
`-
const kReadFileBufferLength = 8 * 1024;
`
``
9
`+
// Use 64kb in case the file type is not a regular file and thus do not know the
`
``
10
`+
// actual file size. Increasing the value further results in more frequent over
`
``
11
`+
// allocation for small files and consumes CPU time and memory that should be
`
``
12
`+
// used else wise.
`
``
13
`+
// Use up to 512kb per read otherwise to partition reading big files to prevent
`
``
14
`+
// blocking other threads in case the available threads are all in use.
`
``
15
`+
const kReadFileUnknownBufferLength = 64 * 1024;
`
``
16
`+
const kReadFileBufferLength = 512 * 1024;
`
10
17
``
11
18
`function readFileAfterRead(err, bytesRead) {
`
12
19
`const context = this.context;
`
13
20
``
14
21
`if (err)
`
15
22
`return context.close(err);
`
16
23
``
17
``
`-
if (bytesRead === 0)
`
18
``
`-
return context.close();
`
19
``
-
20
24
`context.pos += bytesRead;
`
21
25
``
22
``
`-
if (context.size !== 0) {
`
23
``
`-
if (context.pos === context.size)
`
24
``
`-
context.close();
`
25
``
`-
else
`
26
``
`-
context.read();
`
``
26
`+
if (context.pos === context.size || bytesRead === 0) {
`
``
27
`+
context.close();
`
27
28
`} else {
`
28
``
`-
// Unknown size, just read until we don't get bytes.
`
29
``
`-
context.buffers.push(context.buffer.slice(0, bytesRead));
`
``
29
`+
if (context.size === 0) {
`
``
30
`+
// Unknown size, just read until we don't get bytes.
`
``
31
`+
const buffer = bytesRead === kReadFileUnknownBufferLength ?
`
``
32
`+
context.buffer : context.buffer.slice(0, bytesRead);
`
``
33
`+
context.buffers.push(buffer);
`
``
34
`+
}
`
30
35
`context.read();
`
31
36
`}
`
32
37
`}
`
`@@ -60,7 +65,7 @@ class ReadFileContext {
`
60
65
`constructor(callback, encoding) {
`
61
66
`this.fd = undefined;
`
62
67
`this.isUserFd = undefined;
`
63
``
`-
this.size = undefined;
`
``
68
`+
this.size = 0;
`
64
69
`this.callback = callback;
`
65
70
`this.buffers = null;
`
66
71
`this.buffer = null;
`
`@@ -75,9 +80,10 @@ class ReadFileContext {
`
75
80
`let length;
`
76
81
``
77
82
`if (this.size === 0) {
`
78
``
`-
buffer = this.buffer = Buffer.allocUnsafeSlow(kReadFileBufferLength);
`
``
83
`+
buffer = Buffer.allocUnsafeSlow(kReadFileUnknownBufferLength);
`
79
84
`offset = 0;
`
80
``
`-
length = kReadFileBufferLength;
`
``
85
`+
length = kReadFileUnknownBufferLength;
`
``
86
`+
this.buffer = buffer;
`
81
87
`} else {
`
82
88
`buffer = this.buffer;
`
83
89
`offset = this.pos;
`