Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Yershov <yershov@corp.mail.ru>2015-01-13 12:57:49 +0300
committerAlex Zolotarev <alex@maps.me>2015-09-23 02:36:08 +0300
commiteaf43ae6feedb2e4e5f59e3932968d32c8f9f965 (patch)
treee019ca7960f0e230634ca877ff230a030219aca6 /coding/var_record_reader.hpp
parenta873972368be4f5a386ced6d671b6bed81a2164c (diff)
Optimization memory reallocation while reading variable length records
Simple optimization get_mark_value Correct working with paths in generator_tool
Diffstat (limited to 'coding/var_record_reader.hpp')
-rw-r--r--coding/var_record_reader.hpp17
1 files changed, 11 insertions, 6 deletions
diff --git a/coding/var_record_reader.hpp b/coding/var_record_reader.hpp
index 45b2a7072f..c21ccbf54d 100644
--- a/coding/var_record_reader.hpp
+++ b/coding/var_record_reader.hpp
@@ -31,23 +31,28 @@ public:
ASSERT_GREATER_OR_EQUAL(expectedRecordSize, 4, ());
}
- uint64_t ReadRecord(uint64_t const pos, vector<char> & buffer, uint32_t & recordOffset) const
+ uint64_t ReadRecord(uint64_t const pos, vector<char> & buffer, uint32_t & recordOffset, uint32_t & actualSize) const
{
ASSERT_LESS(pos, m_ReaderSize, ());
uint32_t const initialSize = static_cast<uint32_t>(
min(static_cast<uint64_t>(m_ExpectedRecordSize), m_ReaderSize - pos));
- buffer.resize(initialSize);
+
+ if (buffer.size() < initialSize)
+ buffer.resize(initialSize);
+
m_Reader.Read(pos, &buffer[0], initialSize);
ArrayByteSource source(&buffer[0]);
uint32_t const recordSize = VarRecordSizeReaderFn(source);
uint32_t const recordSizeSize = static_cast<uint32_t>(source.PtrC() - &buffer[0]);
uint32_t const fullSize = recordSize + recordSizeSize;
ASSERT_LESS_OR_EQUAL(pos + fullSize, m_ReaderSize, ());
- buffer.resize(fullSize);
+ if (buffer.size() < fullSize)
+ buffer.resize(fullSize);
if (initialSize < fullSize)
m_Reader.Read(pos + initialSize, &buffer[initialSize], fullSize - initialSize);
recordOffset = recordSizeSize;
+ actualSize = fullSize;
return pos + fullSize;
}
@@ -58,10 +63,10 @@ public:
vector<char> buffer;
while (pos < m_ReaderSize)
{
- uint32_t offset;
- uint64_t nextPos = ReadRecord(pos, buffer, offset);
+ uint32_t offset = 0, size = 0;
+ uint64_t nextPos = ReadRecord(pos, buffer, offset, size);
// uint64_t -> uint32_t : assume that feature dat file not more than 4Gb
- f(static_cast<uint32_t>(pos), &buffer[offset], static_cast<uint32_t>(buffer.size() - offset));
+ f(static_cast<uint32_t>(pos), &buffer[offset], static_cast<uint32_t>(size - offset));
pos = nextPos;
}
ASSERT_EQUAL(pos, m_ReaderSize, ());