Skip to content

typeCast is up to 10x slower #889

@gbelur

Description

@gbelur

When the typeCast option is used, queries tend to run up to 10x slower under load. A perf profile shows that most of the additional time is spent in column_defintion.js obtaining the schema and table name in the code below:

const addString = function(name) {
  Object.defineProperty(ColumnDefinition.prototype, name, {
    get: function() {
      const start = this['_' + name + 'Start'];
      const end = start + this['_' + name + 'Length'];
      return StringParser.decode(
        this._buf.slice(start, end),
        this.encoding === 'binary' ? this._clientEncoding : this.encoding
      );
    }
  });
};

These fields are meant to be computed lazily, but end up getting recomputed for every field access as part of the 'wrap' function implementation that needs field.schema, field.table and field.name

function wrap(field, type, packet, encoding) {
    return {
      type: type,
      length: field.columnLength,
      db: field.schema,
      table: field.table,
      name: field.name,
      string: function() {
        return packet.readLengthCodedString(encoding);
      },
      buffer: function() {
        return packet.readLengthCodedBuffer();
      },
      geometry: function() {
        return packet.parseGeometryValue();
      }
    };
  }

Given that these fields are used for every column, can these be precomputed?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions