From: Jean Privat Date: Tue, 10 Mar 2015 13:51:03 +0000 (+0700) Subject: Merge: Faster buffers X-Git-Tag: v0.7.3~34 X-Git-Url: http://nitlanguage.org?hp=e42ec5ff886b153fd8733f24ffde3513c42da250 Merge: Faster buffers Make flatbuffers a little faster on substrings for nitc/nitc/nitc before: 0m7.168s after: 0m7.068s (-1.4%) Pull-Request: #1189 Reviewed-by: Lucas Bajolet Reviewed-by: Alexis Laferrière Reviewed-by: Alexandre Terrasa --- diff --git a/lib/standard/stream.nit b/lib/standard/stream.nit index 1e4ba18..7df1bd1 100644 --- a/lib/standard/stream.nit +++ b/lib/standard/stream.nit @@ -404,6 +404,7 @@ abstract class BufferedReader if _buffer_pos + i >= _buffer.length then var from = _buffer_pos _buffer_pos = _buffer.length + if from == 0 then return _buffer.to_s return _buffer.substring_from(from).to_s end _buffer_pos += i diff --git a/lib/standard/string.nit b/lib/standard/string.nit index b99fc99..e78f655 100644 --- a/lib/standard/string.nit +++ b/lib/standard/string.nit @@ -1180,10 +1180,14 @@ class FlatString # String Specific Methods # ################################################## - private init with_infos(items: NativeString, len: Int, from: Int, to: Int) + # Low-level creation of a new string with given data. + # + # `items` will be used as is, without copy, to retrieve the characters of the string. + # Aliasing issues is the responsibility of the caller. + private init with_infos(items: NativeString, length: Int, from: Int, to: Int) do self.items = items - length = len + self.length = length index_from = from index_to = to end @@ -1627,6 +1631,20 @@ class FlatBuffer # Create a new empty string. init do end + # Low-level creation a new buffer with given data. + # + # `items` will be used as is, without copy, to store the characters of the buffer. + # Aliasing issues is the responsibility of the caller. + # + # If `items` is shared, `written` should be set to true after the creation + # so that a modification will do a copy-on-write. + private init with_infos(items: NativeString, capacity, length: Int) + do + self.items = items + self.length = length + self.capacity = capacity + end + # Create a new string copied from `s`. init from(s: Text) do @@ -1651,7 +1669,6 @@ class FlatBuffer init with_capacity(cap: Int) do assert cap >= 0 - # _items = new NativeString.calloc(cap) items = new NativeString(cap+1) capacity = cap length = 0 @@ -1695,11 +1712,10 @@ class FlatBuffer if from < 0 then from = 0 if count > length then count = length if from < count then - var r = new FlatBuffer.with_capacity(count - from) - while from < count do - r.chars.push(items[from]) - from += 1 - end + var len = count - from + var r_items = new NativeString(len) + items.copy_to(r_items, len, from, 0) + var r = new FlatBuffer.with_infos(r_items, len, len) return r else return new FlatBuffer