Skip to content

Commit

Permalink
Reuse the objects to improve the performance of parsing WKTs. (#548)
Browse files Browse the repository at this point in the history
Parsing of every WKT through WKTReader.Read() is initailizing new object of 'StreamTokenizerSettings' with default values and then overwritting it. Changes are done to initialize it once and re-use it with every WKTReader.Read() method.
  • Loading branch information
Amit909Singh committed Sep 15, 2021
1 parent 0a3cd39 commit 72e1a4c
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 15 deletions.
3 changes: 3 additions & 0 deletions src/NetTopologySuite/ApiCompatBaseline.txt
@@ -0,0 +1,3 @@
Compat issues with assembly NetTopologySuite:
CannotChangeAttribute : Attribute 'System.Runtime.CompilerServices.IteratorStateMachineAttribute' on 'RTools_NTS.Util.StreamTokenizer.GetEnumerator()' changed from '[IteratorStateMachineAttribute(typeof(StreamTokenizer.<GetEnumerator>d__33))]' in the contract to '[IteratorStateMachineAttribute(typeof(StreamTokenizer.<GetEnumerator>d__34))]' in the implementation.
Total Issues: 1
33 changes: 20 additions & 13 deletions src/NetTopologySuite/IO/WKTReader.cs
Expand Up @@ -44,6 +44,8 @@ public class WKTReader

private static readonly CoordinateSequenceFactory CoordinateSequenceFactoryXYZM = CoordinateArraySequenceFactory.Instance;

private static readonly StreamTokenizerSettings tokenizerSettings;

private NtsGeometryServices _ntsGeometryServices;

private int? _overriddenDefaultSRID;
Expand All @@ -56,6 +58,23 @@ public class WKTReader
*/
private bool _isStrict = true;

static WKTReader()
{
tokenizerSettings = new StreamTokenizerSettings();
tokenizerSettings.SetDefaults();
// set tokenizer to NOT parse numbers
tokenizerSettings.ResetCharTypeTable();
tokenizerSettings.WordChars('a', 'z');
tokenizerSettings.WordChars('A', 'Z');
////tokenizer.Settings.WordChars(128 + 32, 255);
tokenizerSettings.WordChars('0', '9');
tokenizerSettings.WordChars('-', '-');
tokenizerSettings.WordChars('+', '+');
tokenizerSettings.WordChars('.', '.');
tokenizerSettings.WhitespaceChars(0, ' ');
tokenizerSettings.CommentChar('#');
}

/// <summary>
/// Creates a <c>WKTReader</c> that creates objects using a basic GeometryFactory.
/// </summary>
Expand Down Expand Up @@ -203,19 +222,7 @@ public Geometry Read(TextReader reader)

internal TokenStream Tokenizer(TextReader reader)
{
var tokenizer = new StreamTokenizer(reader);

// set tokenizer to NOT parse numbers
tokenizer.Settings.ResetCharTypeTable();
tokenizer.Settings.WordChars('a', 'z');
tokenizer.Settings.WordChars('A', 'Z');
////tokenizer.Settings.WordChars(128 + 32, 255);
tokenizer.Settings.WordChars('0', '9');
tokenizer.Settings.WordChars('-', '-');
tokenizer.Settings.WordChars('+', '+');
tokenizer.Settings.WordChars('.', '.');
tokenizer.Settings.WhitespaceChars(0, ' ');
tokenizer.Settings.CommentChar('#');
var tokenizer = new StreamTokenizer(reader, tokenizerSettings);
return new TokenStream(tokenizer.GetEnumerator());
}

Expand Down
19 changes: 17 additions & 2 deletions src/NetTopologySuite/Utilities/RToolsUtil/StreamTokenizer.cs
Expand Up @@ -704,6 +704,18 @@ public StreamTokenizer(TextReader sr)
textReader = sr;
}

/// <summary>
/// Construct and set this object's TextReader to the one specified.
/// </summary>
/// <param name="sr">The TextReader to read from.</param>
/// <param name="tokenizerSettings">Tokenizer settings.</param>
public StreamTokenizer(TextReader sr, StreamTokenizerSettings tokenizerSettings)
{
settings = tokenizerSettings;
Initialize();
textReader = sr;
}

/// <summary>
/// Construct and set a string to tokenize.
/// </summary>
Expand All @@ -723,8 +735,11 @@ void Initialize()
nextTokenSb = new CharBuffer(1024);

InitializeStream();
settings = new StreamTokenizerSettings();
settings.SetDefaults();
if (null == settings)
{
settings = new StreamTokenizerSettings();
settings.SetDefaults();
}

expSb = new CharBuffer();
tmpSb = new CharBuffer();
Expand Down

0 comments on commit 72e1a4c

Please sign in to comment.