Skip to content

Commit

Permalink
perf: more fast paths in webidl dict converter
Browse files Browse the repository at this point in the history
  • Loading branch information
lucacasonato committed Apr 19, 2021
1 parent 4cb808c commit 1209b5e
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 11 deletions.
36 changes: 27 additions & 9 deletions op_crates/webgpu/02_idl_types.js
Original file line number Diff line number Diff line change
Expand Up @@ -135,15 +135,19 @@
converter: webidl.createSequenceConverter(
webidl.converters["GPUFeatureName"],
),
defaultValue: [],
get defaultValue() {
return [];
},
},
{
key: "nonGuaranteedLimits",
converter: webidl.createRecordConverter(
webidl.converters["DOMString"],
webidl.converters["GPUSize32"],
),
defaultValue: {},
get defaultValue() {
return {};
},
},
];
webidl.converters["GPUDeviceDescriptor"] = webidl.createDictionaryConverter(
Expand Down Expand Up @@ -1046,7 +1050,9 @@
webidl.converters["GPUVertexBufferLayout"],
),
),
defaultValue: [],
get defaultValue() {
return [];
},
},
];
webidl.converters["GPUVertexState"] = webidl.createDictionaryConverter(
Expand Down Expand Up @@ -1187,12 +1193,16 @@
{
key: "stencilFront",
converter: webidl.converters["GPUStencilFaceState"],
defaultValue: {},
get defaultValue() {
return {};
},
},
{
key: "stencilBack",
converter: webidl.converters["GPUStencilFaceState"],
defaultValue: {},
get defaultValue() {
return {};
},
},
{
key: "stencilReadMask",
Expand Down Expand Up @@ -1379,7 +1389,9 @@
{
key: "primitive",
converter: webidl.converters["GPUPrimitiveState"],
defaultValue: {},
get defaultValue() {
return {};
},
},
{
key: "depthStencil",
Expand All @@ -1388,7 +1400,9 @@
{
key: "multisample",
converter: webidl.converters["GPUMultisampleState"],
defaultValue: {},
get defaultValue() {
return {};
},
},
{ key: "fragment", converter: webidl.converters["GPUFragmentState"] },
];
Expand Down Expand Up @@ -1530,7 +1544,9 @@
{
key: "origin",
converter: webidl.converters["GPUOrigin3D"],
defaultValue: {},
get defaultValue() {
return {};
},
},
{
key: "aspect",
Expand Down Expand Up @@ -1793,7 +1809,9 @@
converter: webidl.createSequenceConverter(
webidl.converters["GPUPipelineStatisticName"],
),
defaultValue: [],
get defaultValue() {
return [];
},
},
];
webidl.converters["GPUQuerySetDescriptor"] = webidl.createDictionaryConverter(
Expand Down
35 changes: 33 additions & 2 deletions op_crates/webidl/00_webidl.js
Original file line number Diff line number Diff line change
Expand Up @@ -580,10 +580,19 @@
}
}

function isEmptyObject(V) {
for (const _ in V) return false;
return true;
}

function createDictionaryConverter(name, ...dictionaries) {
let hasRequiredKey = false;
const allMembers = [];
for (const members of dictionaries) {
for (const member of members) {
if (member.required) {
hasRequiredKey = true;
}
allMembers.push(member);
}
}
Expand All @@ -597,8 +606,23 @@
const defaultValues = {};
for (const member of allMembers) {
if ("defaultValue" in member) {
const idlMemberValue = member.defaultValue;
defaultValues[member.key] = idlMemberValue;
let idlMemberValue = member.defaultValue;
let imvType = typeof idlMemberValue;
// Copy by value types can be directly assigned, copy by reference types
// need to be re-created for each allocation.
if (
imvType === "number" || imvType === "boolean" ||
imvType === "string" || imvType === "bigint" ||
imvType === "undefined"
) {
defaultValues[member.key] = idlMemberValue;
} else {
Object.defineProperty(defaultValues, member.key, {
get() {
return member.defaultValue;
},
});
}
}
}

Expand All @@ -620,6 +644,13 @@

const idlDict = Object.assign({}, defaultValues);

This comment has been minimized.

Copy link
@aapoalas

aapoalas Apr 20, 2021

Collaborator

Very mild performance optimization: { ...defaultValues } is faster than Object.assign({}, defaultValues) for some reason. This is one of the exceptions to the "old is fast, new is slow" rule.


// NOTE: fast path Null and Undefined and empty objects.
if (
(V === undefined || V === null || isEmptyObject(V)) && !hasRequiredKey
) {
return idlDict;
}

for (const member of allMembers) {
const key = member.key;

Expand Down

0 comments on commit 1209b5e

Please sign in to comment.