Metadata Types: Use a single type instance where it makes sense

One of the possible problems of #1184 (firefox freezing periodically
with Tridactyl enabled) is that Tridactyl uses too much RAM, which could
cause Firefox to attempt to GC it from time to time.
One easy optimisation to try to reduce this problem is to use singletons
for metadata when possible (VoidType, AnyType...).
According to my measurements, this saves the allocation of 933 objects,
which amounted to ~0.03MB. Multiply this by 40 tabs and you get about
1.20MB saved, the space of a whole 1980-era floppy disk.
This commit is contained in:
glacambre 2018-11-21 06:56:01 +01:00
parent 7e21d64025
commit a808e9e742
No known key found for this signature in database
GPG key ID: B9625DB1767553AC
5 changed files with 10 additions and 5 deletions

View file

@ -1,12 +1,13 @@
import { Type } from "./Type" import { Type } from "./Type"
export class AnyType implements Type { export class AnyType implements Type {
static instance = new AnyType()
kind = "any" kind = "any"
constructor() {} constructor() {}
toConstructor() { toConstructor() {
return "new AnyType()" return "AnyType.instance"
} }
toString() { toString() {

View file

@ -1,12 +1,13 @@
import { Type } from "./Type" import { Type } from "./Type"
export class BooleanType implements Type { export class BooleanType implements Type {
static instance = new BooleanType()
kind = "boolean" kind = "boolean"
constructor() {} constructor() {}
toConstructor() { toConstructor() {
return "new BooleanType()" return "BooleanType.instance"
} }
toString() { toString() {

View file

@ -1,12 +1,13 @@
import { Type } from "./Type" import { Type } from "./Type"
export class NumberType implements Type { export class NumberType implements Type {
static instance = new NumberType()
kind = "number" kind = "number"
constructor() {} constructor() {}
toConstructor() { toConstructor() {
return "new NumberType()" return "NumberType.instance"
} }
toString() { toString() {

View file

@ -1,12 +1,13 @@
import { Type } from "./Type" import { Type } from "./Type"
export class StringType implements Type { export class StringType implements Type {
static instance = new StringType()
kind = "string" kind = "string"
constructor() {} constructor() {}
toConstructor() { toConstructor() {
return "new StringType()" return "StringType.instance"
} }
toString() { toString() {

View file

@ -1,12 +1,13 @@
import { Type } from "./Type" import { Type } from "./Type"
export class VoidType implements Type { export class VoidType implements Type {
static instance = new VoidType()
kind = "void" kind = "void"
constructor() {} constructor() {}
toConstructor() { toConstructor() {
return "new VoidType()" return "VoidType.instance"
} }
toString() { toString() {