mirror of https://github.com/ecmwf/eccodes.git
Performance: reduce number of calls to malloc
This commit is contained in:
parent
369494108e
commit
0f2f6e335a
|
@ -243,10 +243,13 @@ static void __expand(grib_accessor* a, bufr_descriptors_array* unexpanded, bufr_
|
||||||
int k, j, i;
|
int k, j, i;
|
||||||
grib_accessor_expanded_descriptors* self = (grib_accessor_expanded_descriptors*)a;
|
grib_accessor_expanded_descriptors* self = (grib_accessor_expanded_descriptors*)a;
|
||||||
size_t size = 0;
|
size_t size = 0;
|
||||||
long* v = NULL;
|
long* v_array = NULL;
|
||||||
bufr_descriptor* u = NULL;
|
bufr_descriptor* u = NULL;
|
||||||
bufr_descriptor* vv = NULL;
|
bufr_descriptor* vv = NULL;
|
||||||
bufr_descriptor** ur = NULL;
|
/* 'ur' is the array of bufr_descriptor pointers - max size is X (from FXY) which is 6 bits
|
||||||
|
* so we do not need to go to the heap
|
||||||
|
*/
|
||||||
|
bufr_descriptor* ur[65] = {0,};
|
||||||
bufr_descriptor* urc = NULL;
|
bufr_descriptor* urc = NULL;
|
||||||
int idx;
|
int idx;
|
||||||
bufr_descriptor* u0 = NULL;
|
bufr_descriptor* u0 = NULL;
|
||||||
|
@ -286,17 +289,17 @@ static void __expand(grib_accessor* a, bufr_descriptors_array* unexpanded, bufr_
|
||||||
grib_bufr_descriptor_delete(u);
|
grib_bufr_descriptor_delete(u);
|
||||||
if (*err)
|
if (*err)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
v = (long*)grib_context_malloc_clear(c, sizeof(long) * size);
|
v_array = (long*)grib_context_malloc_clear(c, sizeof(long) * size);
|
||||||
*err = grib_get_long_array(hand, self->sequence, v, &size);
|
*err = grib_get_long_array(hand, self->sequence, v_array, &size);
|
||||||
if (*err)
|
if (*err)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
inner_unexpanded = grib_bufr_descriptors_array_new(c, DESC_SIZE_INIT, DESC_SIZE_INCR);
|
inner_unexpanded = grib_bufr_descriptors_array_new(c, DESC_SIZE_INIT, DESC_SIZE_INCR);
|
||||||
for (i = 0; i < size; i++) {
|
for (i = 0; i < size; i++) {
|
||||||
vv = grib_bufr_descriptor_new(self->tablesAccessor, v[i], !SILENT, err);
|
vv = grib_bufr_descriptor_new(self->tablesAccessor, v_array[i], !SILENT, err);
|
||||||
inner_unexpanded = grib_bufr_descriptors_array_push(inner_unexpanded, vv);
|
inner_unexpanded = grib_bufr_descriptors_array_push(inner_unexpanded, vv);
|
||||||
}
|
}
|
||||||
grib_context_free(c, v);
|
grib_context_free(c, v_array);
|
||||||
inner_expanded = do_expand(a, inner_unexpanded, ccp, err);
|
inner_expanded = do_expand(a, inner_unexpanded, ccp, err);
|
||||||
if (*err)
|
if (*err)
|
||||||
return;
|
return;
|
||||||
|
@ -372,6 +375,7 @@ static void __expand(grib_accessor* a, bufr_descriptors_array* unexpanded, bufr_
|
||||||
size++;
|
size++;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
/* replication with fixed number of descriptors (non-delayed) */
|
||||||
DESCRIPTORS_POP_FRONT_OR_RETURN(unexpanded, u);
|
DESCRIPTORS_POP_FRONT_OR_RETURN(unexpanded, u);
|
||||||
#if MYDEBUG
|
#if MYDEBUG
|
||||||
for (idepth = 0; idepth < global_depth; idepth++)
|
for (idepth = 0; idepth < global_depth; idepth++)
|
||||||
|
@ -380,7 +384,8 @@ static void __expand(grib_accessor* a, bufr_descriptors_array* unexpanded, bufr_
|
||||||
#endif
|
#endif
|
||||||
grib_bufr_descriptor_delete(u);
|
grib_bufr_descriptor_delete(u);
|
||||||
size = us->X * us->Y;
|
size = us->X * us->Y;
|
||||||
ur = (bufr_descriptor**)grib_context_malloc_clear(c, us->X * sizeof(bufr_descriptor*));
|
|
||||||
|
memset(ur, 0, us->X);
|
||||||
for (j = 0; j < us->X; j++) {
|
for (j = 0; j < us->X; j++) {
|
||||||
DESCRIPTORS_POP_FRONT_OR_RETURN(unexpanded, ur[j]);
|
DESCRIPTORS_POP_FRONT_OR_RETURN(unexpanded, ur[j]);
|
||||||
#if MYDEBUG
|
#if MYDEBUG
|
||||||
|
@ -402,7 +407,7 @@ static void __expand(grib_accessor* a, bufr_descriptors_array* unexpanded, bufr_
|
||||||
}
|
}
|
||||||
for (i = 0; i < us->X; i++)
|
for (i = 0; i < us->X; i++)
|
||||||
grib_bufr_descriptor_delete(ur[i]);
|
grib_bufr_descriptor_delete(ur[i]);
|
||||||
grib_context_free(c, ur);
|
|
||||||
inner_expanded = do_expand(a, inner_unexpanded, ccp, err);
|
inner_expanded = do_expand(a, inner_unexpanded, ccp, err);
|
||||||
if (*err)
|
if (*err)
|
||||||
return;
|
return;
|
||||||
|
@ -646,6 +651,7 @@ static int expand(grib_accessor* a)
|
||||||
grib_context_log(c, GRIB_LOG_ERROR, "%s: Unexpanded size is zero!", a->name);
|
grib_context_log(c, GRIB_LOG_ERROR, "%s: Unexpanded size is zero!", a->name);
|
||||||
return GRIB_DECODING_ERROR;
|
return GRIB_DECODING_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
u = (long*)grib_context_malloc_clear(c, sizeof(long) * unexpandedSize);
|
u = (long*)grib_context_malloc_clear(c, sizeof(long) * unexpandedSize);
|
||||||
if (!u) {
|
if (!u) {
|
||||||
err = GRIB_OUT_OF_MEMORY;
|
err = GRIB_OUT_OF_MEMORY;
|
||||||
|
|
Loading…
Reference in New Issue