Skip to content

Commit f51b9c9

Browse files
committed
perf: ⚡️ improve writer, get direct reference to buffers
1 parent 025f38e commit f51b9c9

File tree

1 file changed

+65
-38
lines changed

1 file changed

+65
-38
lines changed

src/rpc/RpcMessageEncoder.ts

Lines changed: 65 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import {Writer} from '@jsonjoy.com/util/lib/buffers/Writer';
2-
import type {IWriter, IWriterGrowable} from '@jsonjoy.com/util/lib/buffers';
3-
import type {Reader} from '@jsonjoy.com/buffers/lib/Reader';
2+
import {Reader} from '@jsonjoy.com/buffers/lib/Reader';
43
import {RpcMsgType, RpcReplyStat, RPC_VERSION} from './constants';
54
import {RpcEncodingError} from './errors';
65
import {
@@ -10,6 +9,7 @@ import {
109
RpcRejectedReplyMessage,
1110
RpcMessage,
1211
} from './messages';
12+
import type {IWriter, IWriterGrowable} from '@jsonjoy.com/util/lib/buffers';
1313

1414
export class RpcMessageEncoder<W extends IWriter & IWriterGrowable = IWriter & IWriterGrowable> {
1515
constructor(public readonly writer: W = new Writer() as any) {}
@@ -73,25 +73,29 @@ export class RpcMessageEncoder<W extends IWriter & IWriterGrowable = IWriter & I
7373
params?: Reader | Uint8Array,
7474
): void {
7575
const writer = this.writer;
76-
writer.u32(xid);
77-
writer.u32(RpcMsgType.CALL);
78-
writer.u32(RPC_VERSION);
79-
writer.u32(prog);
80-
writer.u32(vers);
81-
writer.u32(proc);
76+
writer.ensureCapacity(16 * 4);
77+
const view = writer.view;
78+
let x = writer.x;
79+
view.setUint32(x, xid, false);
80+
x += 4;
81+
view.setUint32(x, RpcMsgType.CALL, false);
82+
x += 4;
83+
view.setUint32(x, RPC_VERSION, false);
84+
x += 4;
85+
view.setUint32(x, prog, false);
86+
x += 4;
87+
view.setUint32(x, vers, false);
88+
x += 4;
89+
view.setUint32(x, proc, false);
90+
x += 4;
91+
writer.x = x;
8292
this.writeOpaqueAuth(cred);
8393
this.writeOpaqueAuth(verf);
84-
if (params) {
85-
if (params instanceof Uint8Array) {
86-
if (params.length > 0) {
87-
writer.buf(params, params.length);
88-
}
89-
} else {
90-
const size = params.size();
91-
if (size > 0) {
92-
writer.buf(params.uint8, size);
93-
}
94-
}
94+
if (params instanceof Uint8Array) {
95+
if (params.length > 0) writer.buf(params, params.length);
96+
} else if (params instanceof Reader) {
97+
const size = params.size();
98+
if (size > 0) writer.buf(params.subarray(0, size), size);
9599
}
96100
}
97101

@@ -103,9 +107,16 @@ export class RpcMessageEncoder<W extends IWriter & IWriterGrowable = IWriter & I
103107
results?: Reader | Uint8Array,
104108
): void {
105109
const writer = this.writer;
106-
writer.u32(xid);
107-
writer.u32(RpcMsgType.REPLY);
108-
writer.u32(RpcReplyStat.MSG_ACCEPTED);
110+
writer.ensureCapacity(16 * 4);
111+
const view = writer.view;
112+
let x = writer.x;
113+
view.setUint32(x, xid, false);
114+
x += 4;
115+
view.setUint32(x, RpcMsgType.REPLY, false);
116+
x += 4;
117+
view.setUint32(x, RpcReplyStat.MSG_ACCEPTED, false);
118+
x += 4;
119+
writer.x = x;
109120
this.writeOpaqueAuth(verf);
110121
writer.u32(acceptStat);
111122
if (mismatchInfo) {
@@ -114,14 +125,10 @@ export class RpcMessageEncoder<W extends IWriter & IWriterGrowable = IWriter & I
114125
}
115126
if (results) {
116127
if (results instanceof Uint8Array) {
117-
if (results.length > 0) {
118-
writer.buf(results, results.length);
119-
}
128+
if (results.length > 0) writer.buf(results, results.length);
120129
} else {
121130
const size = results.size();
122-
if (size > 0) {
123-
writer.buf(results.uint8, size);
124-
}
131+
if (size > 0) writer.buf(results.uint8, size);
125132
}
126133
}
127134
}
@@ -133,32 +140,52 @@ export class RpcMessageEncoder<W extends IWriter & IWriterGrowable = IWriter & I
133140
authStat?: number,
134141
): void {
135142
const writer = this.writer;
136-
writer.u32(xid);
137-
writer.u32(RpcMsgType.REPLY);
138-
writer.u32(RpcReplyStat.MSG_DENIED);
139-
writer.u32(rejectStat);
143+
writer.ensureCapacity(7 * 4);
144+
const view = writer.view;
145+
let x = writer.x;
146+
view.setUint32(x, xid, false);
147+
x += 4;
148+
view.setUint32(x, RpcMsgType.REPLY, false);
149+
x += 4;
150+
view.setUint32(x, RpcReplyStat.MSG_DENIED, false);
151+
x += 4;
152+
view.setUint32(x, rejectStat, false);
153+
x += 4;
140154
if (mismatchInfo) {
141-
writer.u32(mismatchInfo.low);
142-
writer.u32(mismatchInfo.high);
155+
view.setUint32(x, mismatchInfo.low, false);
156+
x += 4;
157+
view.setUint32(x, mismatchInfo.high, false);
158+
x += 4;
143159
}
144160
if (authStat !== undefined) {
145-
writer.u32(authStat);
161+
view.setUint32(x, authStat, false);
162+
x += 4;
146163
}
164+
writer.x = x;
147165
}
148166

149167
private writeOpaqueAuth(auth: RpcOpaqueAuth): void {
150168
const writer = this.writer;
151-
writer.u32(auth.flavor);
152169
const body = auth.body;
153170
const length = body.size();
154171
if (length > 400) throw new RpcEncodingError('Auth body too large');
155-
writer.u32(length);
172+
writer.ensureCapacity(2 * 4 + length + 3);
173+
const view = writer.view;
174+
let x = writer.x;
175+
view.setUint32(x, auth.flavor, false);
176+
x += 4;
177+
view.setUint32(x, length, false);
178+
x += 4;
156179
if (length > 0) {
180+
writer.x = x;
157181
writer.buf(body.subarray(0, length), length);
182+
x = writer.x;
158183
const padding = (4 - (length % 4)) % 4;
159184
for (let i = 0; i < padding; i++) {
160-
writer.u8(0);
185+
view.setUint8(x, 0);
186+
x += 1;
161187
}
162188
}
189+
writer.x = x;
163190
}
164191
}

0 commit comments

Comments
 (0)