Mercurial > hg > monetdb-java
changeset 373:f15d2ac35932
Optimize HeaderLineParser.parse() method by replacing regionMatches() calls by direct character array comparisons.
Also found (and now corrected) that old regionMatches() calls did not match the first character (offset was 1 and should have been 0).
author | Martin van Dinther <martin.van.dinther@monetdbsolutions.com> |
---|---|
date | Wed, 23 Sep 2020 13:51:47 +0200 (2020-09-23) |
parents | 159c628527c4 |
children | 31e79dd9e658 |
files | src/main/java/nl/cwi/monetdb/mcl/parser/HeaderLineParser.java |
diffstat | 1 files changed, 13 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/src/main/java/nl/cwi/monetdb/mcl/parser/HeaderLineParser.java +++ b/src/main/java/nl/cwi/monetdb/mcl/parser/HeaderLineParser.java @@ -52,9 +52,10 @@ public final class HeaderLineParser exte int pos = 0; boolean foundChar = false; boolean nameFound = false; + int i; // find header name searching from the end of the line - for (int i = len - 1; i >= 0; i--) { + for (i = len - 1; i >= 0; i--) { switch (chrLine[i]) { case ' ': case '\n': @@ -84,27 +85,32 @@ public final class HeaderLineParser exte // depending on the name of the header, we continue int type = 0; + i = pos; switch (len - pos) { case 4: - // source.regionMatches(pos + 1, "name", 1, 3) - if (chrLine[pos] == 'n' && chrLine[pos+1] == 'a' && chrLine[pos+2] == 'm' && chrLine[pos+3] == 'e') { + // source.regionMatches(pos + 1, "name", 0, 4) + if (chrLine[i] == 'n' && chrLine[++i] == 'a' && chrLine[++i] == 'm' && chrLine[++i] == 'e') { getValues(chrLine, 2, pos - 3); type = NAME; } else - // source.regionMatches(pos + 1, "type", 1, 3) - if (chrLine[pos] == 't' && chrLine[pos+1] == 'y' && chrLine[pos+2] == 'p' && chrLine[pos+3] == 'e') { + // source.regionMatches(pos + 1, "type", 0, 4) + if (chrLine[i] == 't' && chrLine[++i] == 'y' && chrLine[++i] == 'p' && chrLine[++i] == 'e') { getValues(chrLine, 2, pos - 3); type = TYPE; } break; case 6: - if (source.regionMatches(pos + 1, "length", 1, 5)) { + // source.regionMatches(pos + 1, "length", 0, 6) + if (chrLine[ i ] == 'l' && chrLine[++i] == 'e' && chrLine[++i] == 'n' && chrLine[++i] == 'g' + && chrLine[++i] == 't' && chrLine[++i] == 'h') { getIntValues(chrLine, 2, pos - 3); type = LENGTH; } break; case 10: - if (source.regionMatches(pos + 1, "table_name", 1, 9)) { + // source.regionMatches(pos + 1, "table_name", 0, 10) + if (chrLine[ i ] == 't' && chrLine[++i] == 'a' && chrLine[++i] == 'b' && chrLine[++i] == 'l' && chrLine[++i] == 'e' + && chrLine[++i] == '_' && chrLine[++i] == 'n' && chrLine[++i] == 'a' && chrLine[++i] == 'm' && chrLine[++i] == 'e') { getValues(chrLine, 2, pos - 3); type = TABLE; }