version 2.3.0_beta
optimize PIChunkStream::readAll() optimize PIEvaluator
This commit is contained in:
@@ -80,11 +80,36 @@ int PIChunkStream::read() {
|
||||
}
|
||||
|
||||
|
||||
int PIChunkStream::peekVInt(Version version_, PIByteArray * data_, int pos, PIByteArray & hdr, uint & ret) {
|
||||
switch (version_) {
|
||||
case Version_1:
|
||||
memcpy(&ret, data_->data(pos), 4);
|
||||
return 4;
|
||||
case Version_2: {
|
||||
hdr.resize(4);
|
||||
hdr.fill(uchar(0));
|
||||
memcpy(hdr.data(), data_->data(pos), piMini(4, data_->size_s() - pos));
|
||||
uchar hsz = 0;
|
||||
ret = readVInt(hdr, &hsz);
|
||||
return hsz;
|
||||
}
|
||||
default: break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void PIChunkStream::readAll() {
|
||||
data_map.clear();
|
||||
while (!atEnd()) {
|
||||
read();
|
||||
data_map[last_id] = last_data;
|
||||
if (!data_) return;
|
||||
int pos = 0, sz = data_->size_s();
|
||||
uint csz = 0, cid = 0;
|
||||
PIByteArray hdr;
|
||||
while (pos < sz) {
|
||||
pos += peekVInt((Version)version_, data_, pos, hdr, cid);
|
||||
pos += peekVInt((Version)version_, data_, pos, hdr, csz);
|
||||
data_map[cid] = PIPair<int, int>(pos, csz);
|
||||
pos += csz;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -111,7 +136,7 @@ void PIChunkStream::_init() {
|
||||
}
|
||||
|
||||
|
||||
uint PIChunkStream::readVInt(PIByteArray & s) {
|
||||
uint PIChunkStream::readVInt(PIByteArray & s, uchar * bytes_cnt) {
|
||||
if (s.isEmpty()) return 0;
|
||||
uchar bytes[4]; s >> bytes[0];
|
||||
uchar abc = 0;
|
||||
@@ -122,6 +147,7 @@ uint PIChunkStream::readVInt(PIByteArray & s) {
|
||||
s >> bytes[abc + 1];
|
||||
} else break;
|
||||
}
|
||||
if (bytes_cnt) *bytes_cnt = (abc + 1);
|
||||
uint ret = 0;
|
||||
for (int i = 0; i <= abc; ++i) {
|
||||
ret += (bytes[i] << (8 * ((int)abc - i)));
|
||||
|
||||
Reference in New Issue
Block a user