Skip to content

Commit df4a55d

Browse files
committed
Speed up allocation during serialization
Add important comment Make enums more direct Comments and csharpier
1 parent c27bf8a commit df4a55d

32 files changed

+217
-158
lines changed

crates/bindings-csharp/BSATN.Codegen/Type.cs

Lines changed: 19 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -422,22 +422,12 @@ public Scope.Extensions ToExtensions()
422422

423423
var bsatnDecls = Members.Cast<MemberDeclaration>();
424424
var fieldNames = bsatnDecls.Select(m => m.Name);
425+
var fieldNamesAndIds = fieldNames.Select((name, i) => (name, i));
425426

426427
extensions.BaseTypes.Add($"System.IEquatable<{ShortName}>");
427428

428429
if (Kind is TypeKind.Sum)
429430
{
430-
extensions.Contents.Append(
431-
$$"""
432-
private {{ShortName}}() { }
433-
434-
internal enum @enum: byte
435-
{
436-
{{string.Join(",\n ", fieldNames)}}
437-
}
438-
439-
"""
440-
);
441431
extensions.Contents.Append(
442432
string.Join(
443433
"\n",
@@ -458,24 +448,24 @@ public override string ToString() =>
458448
);
459449

460450
read = $$"""
461-
__enumTag.Read(reader) switch {
451+
return reader.ReadByte() switch {
462452
{{string.Join(
463453
"\n ",
464-
fieldNames.Select(name =>
465-
$"@enum.{name} => new {name}({name}.Read(reader)),"
454+
fieldNames.Select((name, i) =>
455+
$"{i} => new {name}({name}.Read(reader)),"
466456
)
467457
)}}
468458
_ => throw new System.InvalidOperationException("Invalid tag value, this state should be unreachable.")
469-
}
459+
};
470460
""";
471461

472462
write = $$"""
473463
switch (value) {
474464
{{string.Join(
475465
"\n",
476-
fieldNames.Select(name => $"""
466+
fieldNames.Select((name, i) => $"""
477467
case {name}(var inner):
478-
__enumTag.Write(writer, @enum.{name});
468+
writer.Write((byte){i});
479469
{name}.Write(writer, inner);
480470
break;
481471
"""))}}
@@ -501,10 +491,6 @@ public override string ToString() =>
501491
return 0;
502492
}
503493
""";
504-
505-
bsatnDecls = bsatnDecls.Prepend(
506-
new("__enumTag", new ValueUse("@enum", "SpacetimeDB.BSATN.Enum<@enum>"))
507-
);
508494
}
509495
else
510496
{
@@ -543,7 +529,14 @@ public override string ToString() =>
543529
"""
544530
);
545531

546-
read = $"SpacetimeDB.BSATN.IStructuralReadWrite.Read<{FullName}>(reader)";
532+
// Directly allocating the result object here (instead of calling e.g. IStructuralReadWrite.Read<T>, which does the same thing)
533+
// avoids generics; we've found that generics often result in reflective code being generated.
534+
// Using simple code here hopefully helps IL2CPP and Mono do this faster.
535+
read = $$"""
536+
var ___result = new {{FullName}}();
537+
___result.ReadFields(reader);
538+
return ___result;
539+
""";
547540

548541
write = "value.WriteFields(writer);";
549542

@@ -559,14 +552,17 @@ public override string ToString() =>
559552
""";
560553
}
561554

555+
// It's important that the contained struct here is named BSATN: the C# SDK uses reflection to find this type.
562556
extensions.Contents.Append(
563557
$$"""
564558
565559
public readonly partial struct BSATN : SpacetimeDB.BSATN.IReadWrite<{{FullName}}>
566560
{
567561
{{MemberDeclaration.GenerateBsatnFields(Accessibility.Internal, bsatnDecls)}}
568562
569-
public {{FullName}} Read(System.IO.BinaryReader reader) => {{read}};
563+
public {{FullName}} Read(System.IO.BinaryReader reader) {
564+
{{read}}
565+
}
570566
571567
public void Write(System.IO.BinaryWriter writer, {{FullName}} value) {
572568
{{write}}

crates/bindings-csharp/Codegen.Tests/fixtures/client/snapshots/Type#CustomClass.verified.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,12 @@ public override string ToString() =>
2424
internal static readonly SpacetimeDB.BSATN.I32 IntField = new();
2525
internal static readonly SpacetimeDB.BSATN.String StringField = new();
2626

27-
public CustomClass Read(System.IO.BinaryReader reader) =>
28-
SpacetimeDB.BSATN.IStructuralReadWrite.Read<CustomClass>(reader);
27+
public CustomClass Read(System.IO.BinaryReader reader)
28+
{
29+
var ___result = new CustomClass();
30+
___result.ReadFields(reader);
31+
return ___result;
32+
}
2933

3034
public void Write(System.IO.BinaryWriter writer, CustomClass value)
3135
{

crates/bindings-csharp/Codegen.Tests/fixtures/client/snapshots/Type#CustomStruct.verified.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,12 @@ public override string ToString() =>
2626
internal static readonly SpacetimeDB.BSATN.I32 IntField = new();
2727
internal static readonly SpacetimeDB.BSATN.String StringField = new();
2828

29-
public CustomStruct Read(System.IO.BinaryReader reader) =>
30-
SpacetimeDB.BSATN.IStructuralReadWrite.Read<CustomStruct>(reader);
29+
public CustomStruct Read(System.IO.BinaryReader reader)
30+
{
31+
var ___result = new CustomStruct();
32+
___result.ReadFields(reader);
33+
return ___result;
34+
}
3135

3236
public void Write(System.IO.BinaryWriter writer, CustomStruct value)
3337
{

crates/bindings-csharp/Codegen.Tests/fixtures/client/snapshots/Type#CustomTaggedEnum.verified.cs

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,6 @@
44

55
partial record CustomTaggedEnum : System.IEquatable<CustomTaggedEnum>
66
{
7-
private CustomTaggedEnum() { }
8-
9-
internal enum @enum : byte
10-
{
11-
IntVariant,
12-
StringVariant
13-
}
14-
157
public sealed record IntVariant(int IntVariant_) : CustomTaggedEnum
168
{
179
public override string ToString() =>
@@ -26,31 +18,32 @@ public override string ToString() =>
2618

2719
public readonly partial struct BSATN : SpacetimeDB.BSATN.IReadWrite<CustomTaggedEnum>
2820
{
29-
internal static readonly SpacetimeDB.BSATN.Enum<@enum> __enumTag = new();
3021
internal static readonly SpacetimeDB.BSATN.I32 IntVariant = new();
3122
internal static readonly SpacetimeDB.BSATN.String StringVariant = new();
3223

33-
public CustomTaggedEnum Read(System.IO.BinaryReader reader) =>
34-
__enumTag.Read(reader) switch
24+
public CustomTaggedEnum Read(System.IO.BinaryReader reader)
25+
{
26+
return reader.ReadByte() switch
3527
{
36-
@enum.IntVariant => new IntVariant(IntVariant.Read(reader)),
37-
@enum.StringVariant => new StringVariant(StringVariant.Read(reader)),
28+
0 => new IntVariant(IntVariant.Read(reader)),
29+
1 => new StringVariant(StringVariant.Read(reader)),
3830
_
3931
=> throw new System.InvalidOperationException(
4032
"Invalid tag value, this state should be unreachable."
4133
)
4234
};
35+
}
4336

4437
public void Write(System.IO.BinaryWriter writer, CustomTaggedEnum value)
4538
{
4639
switch (value)
4740
{
4841
case IntVariant(var inner):
49-
__enumTag.Write(writer, @enum.IntVariant);
42+
writer.Write((byte)0);
5043
IntVariant.Write(writer, inner);
5144
break;
5245
case StringVariant(var inner):
53-
__enumTag.Write(writer, @enum.StringVariant);
46+
writer.Write((byte)1);
5447
StringVariant.Write(writer, inner);
5548
break;
5649
}

crates/bindings-csharp/Codegen.Tests/fixtures/client/snapshots/Type#PublicTable.verified.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,8 +100,12 @@ internal static readonly SpacetimeDB.BSATN.RefOption<
100100
SpacetimeDB.BSATN.String
101101
> NullableReferenceField = new();
102102

103-
public PublicTable Read(System.IO.BinaryReader reader) =>
104-
SpacetimeDB.BSATN.IStructuralReadWrite.Read<PublicTable>(reader);
103+
public PublicTable Read(System.IO.BinaryReader reader)
104+
{
105+
var ___result = new PublicTable();
106+
___result.ReadFields(reader);
107+
return ___result;
108+
}
105109

106110
public void Write(System.IO.BinaryWriter writer, PublicTable value)
107111
{

crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#InAnotherNamespace.TestDuplicateTableName.verified.cs

Lines changed: 6 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#TestAutoIncNotInteger.verified.cs

Lines changed: 6 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#TestDuplicateTableName.verified.cs

Lines changed: 6 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#TestIndexIssues.verified.cs

Lines changed: 6 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#TestScheduleIssues.verified.cs

Lines changed: 6 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#TestTableTaggedEnum.verified.cs

Lines changed: 8 additions & 15 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#TestUniqueNotEquatable.verified.cs

Lines changed: 6 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)