Skip to content

Commit 698ac49

Browse files
committed
Small optimization
1 parent a5611e5 commit 698ac49

File tree

1 file changed

+10
-6
lines changed

1 file changed

+10
-6
lines changed

src/entropy/HuffmanEncoder.cpp

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,7 @@ int HuffmanEncoder::limitCodeLengths(const uint alphabet[], uint freqs[], uint16
143143

144144
// Check (up to) 6 levels; one vector per size delta
145145
vector<int> v[6];
146+
size_t vHead[6] = { 0 };
146147

147148
for (int i = 0; i < 6; i++)
148149
v[i].reserve(count - n);
@@ -161,28 +162,31 @@ int HuffmanEncoder::limitCodeLengths(const uint alphabet[], uint freqs[], uint16
161162

162163
// Repay bit debt in a "semi optimized" way
163164
while ((debt > 0) && (idx >= 0)) {
164-
if ((v[idx].empty() == true) || (debt < (1 << idx))) {
165+
if ((vHead[idx] >= v[idx].size()) || (debt < (1 << idx))) {
165166
idx--;
166167
continue;
167168
}
168169

169-
sizes[ranks[v[idx][0]]]++;
170+
// Access element at current head
171+
sizes[ranks[v[idx][vHead[idx]]]]++;
170172
debt -= (1 << idx);
171-
v[idx].erase(v[idx].begin());
173+
174+
// Advance head
175+
vHead[idx]++;
172176
}
173177

174178
idx = 0;
175179

176180
// Adjust if necessary
177181
while ((debt > 0) && (idx < 6)) {
178-
if (v[idx].empty() == true) {
182+
if (vHead[idx] >= v[idx].size()) {
179183
idx++;
180184
continue;
181185
}
182186

183-
sizes[ranks[v[idx][0]]]++;
187+
sizes[ranks[v[idx][vHead[idx]]]]++;
184188
debt -= (1 << idx);
185-
v[idx].erase(v[idx].begin());
189+
vHead[idx]++;
186190
}
187191

188192
if (debt > 0) {

0 commit comments

Comments
 (0)