[postgis-tickets] [SCM] PostGIS branch master updated. 3.1.0alpha2-62-g3d049c8

git at osgeo.org git at osgeo.org
Fri Aug 21 04:38:49 PDT 2020


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "PostGIS".

The branch, master has been updated
       via  3d049c8ef29297fb3473b5df4f24f7edb5fc34f9 (commit)
      from  6ae7988e4def3c64c4b5c0f1d7cb2f6ed70b65f7 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 3d049c8ef29297fb3473b5df4f24f7edb5fc34f9
Author: Raúl Marín <git at rmr.ninja>
Date:   Fri Aug 21 13:37:54 2020 +0200

    Micro optimizations to the serialization process
    
    Closes #4746
    Closes https://github.com/postgis/postgis/pull/577

diff --git a/NEWS b/NEWS
index 68365de..895a11a 100644
--- a/NEWS
+++ b/NEWS
@@ -29,6 +29,7 @@ Only tickets not included in 3.1.0alpha2
            Documentation adjusted (Darafei Praliaskouski)
   - #4737, Improve performance and reduce memory usage in ST_AsMVT, especially in
            queries involving parallelism (Raúl Marín)
+  - #4746, Micro optimizations to the serialization process (Raúl Marín)
 
 * Bug fixes *
   - #4691, Fix segfault during gist index creation with empty geometries (Raúl Marín)
diff --git a/liblwgeom/gserialized2.c b/liblwgeom/gserialized2.c
index f141157..353c107 100644
--- a/liblwgeom/gserialized2.c
+++ b/liblwgeom/gserialized2.c
@@ -684,6 +684,7 @@ static size_t gserialized2_from_lwpoly_size(const LWPOLY *poly)
 {
 	size_t size = 4; /* Type number. */
 	uint32_t i = 0;
+	const size_t point_size = FLAGS_NDIMS(poly->flags) * sizeof(double);
 
 	assert(poly);
 
@@ -694,7 +695,7 @@ static size_t gserialized2_from_lwpoly_size(const LWPOLY *poly)
 	for (i = 0; i < poly->nrings; i++)
 	{
 		size += 4; /* Number of points in ring. */
-		size += poly->rings[i]->npoints * FLAGS_NDIMS(poly->flags) * sizeof(double);
+		size += poly->rings[i]->npoints * point_size;
 	}
 
 	LWDEBUGF(3, "polygon size = %d", size);
@@ -1098,36 +1099,24 @@ static size_t gserialized2_from_extended_flags(lwflags_t lwflags, uint8_t *buf)
 static size_t gserialized2_from_gbox(const GBOX *gbox, uint8_t *buf)
 {
 	uint8_t *loc = buf;
-	float f;
+	float *f;
+	uint8_t i = 0;
 	size_t return_size;
 
 	assert(buf);
 
-	f = next_float_down(gbox->xmin);
-	memcpy(loc, &f, sizeof(float));
-	loc += sizeof(float);
-
-	f = next_float_up(gbox->xmax);
-	memcpy(loc, &f, sizeof(float));
-	loc += sizeof(float);
-
-	f = next_float_down(gbox->ymin);
-	memcpy(loc, &f, sizeof(float));
-	loc += sizeof(float);
-
-	f = next_float_up(gbox->ymax);
-	memcpy(loc, &f, sizeof(float));
-	loc += sizeof(float);
+	f = (float *)buf;
+	f[i++] = next_float_down(gbox->xmin);
+	f[i++] = next_float_up(gbox->xmax);
+	f[i++] = next_float_down(gbox->ymin);
+	f[i++] = next_float_up(gbox->ymax);
+	loc += 4 * sizeof(float);
 
 	if (FLAGS_GET_GEODETIC(gbox->flags))
 	{
-		f = next_float_down(gbox->zmin);
-		memcpy(loc, &f, sizeof(float));
-		loc += sizeof(float);
-
-		f = next_float_up(gbox->zmax);
-		memcpy(loc, &f, sizeof(float));
-		loc += sizeof(float);
+		f[i++] = next_float_down(gbox->zmin);
+		f[i++] = next_float_up(gbox->zmax);
+		loc += 2 * sizeof(float);
 
 		return_size = (size_t)(loc - buf);
 		LWDEBUGF(4, "returning size %d", return_size);
@@ -1136,25 +1125,16 @@ static size_t gserialized2_from_gbox(const GBOX *gbox, uint8_t *buf)
 
 	if (FLAGS_GET_Z(gbox->flags))
 	{
-		f = next_float_down(gbox->zmin);
-		memcpy(loc, &f, sizeof(float));
-		loc += sizeof(float);
-
-		f = next_float_up(gbox->zmax);
-		memcpy(loc, &f, sizeof(float));
-		loc += sizeof(float);
-
+		f[i++] = next_float_down(gbox->zmin);
+		f[i++] = next_float_up(gbox->zmax);
+		loc += 2 * sizeof(float);
 	}
 
 	if (FLAGS_GET_M(gbox->flags))
 	{
-		f = next_float_down(gbox->mmin);
-		memcpy(loc, &f, sizeof(float));
-		loc += sizeof(float);
-
-		f = next_float_up(gbox->mmax);
-		memcpy(loc, &f, sizeof(float));
-		loc += sizeof(float);
+		f[i++] = next_float_down(gbox->mmin);
+		f[i++] = next_float_up(gbox->mmax);
+		loc += 2 * sizeof(float);
 	}
 	return_size = (size_t)(loc - buf);
 	LWDEBUGF(4, "returning size %d", return_size);
@@ -1214,12 +1194,7 @@ GSERIALIZED* gserialized2_from_lwgeom(LWGEOM *geom, size_t *size)
 	/* Calculate size as returned by data processing functions. */
 	return_size = ptr - (uint8_t*)g;
 
-	if (expected_size != return_size) /* Uh oh! */
-	{
-		lwerror("Return size (%lu) not equal to expected size (%lu)!", return_size, expected_size);
-		return NULL;
-	}
-
+	assert(expected_size == return_size);
 	if (size) /* Return the output size to the caller if necessary. */
 		*size = return_size;
 
@@ -1232,9 +1207,10 @@ GSERIALIZED* gserialized2_from_lwgeom(LWGEOM *geom, size_t *size)
 * De-serialize GSERIALIZED into an LWGEOM.
 */
 
-static LWGEOM* lwgeom_from_gserialized2_buffer(uint8_t *data_ptr, lwflags_t lwflags, size_t *size);
+static LWGEOM *lwgeom_from_gserialized2_buffer(uint8_t *data_ptr, lwflags_t lwflags, size_t *size, int32_t srid);
 
-static LWPOINT* lwpoint_from_gserialized2_buffer(uint8_t *data_ptr, lwflags_t lwflags, size_t *size)
+static LWPOINT *
+lwpoint_from_gserialized2_buffer(uint8_t *data_ptr, lwflags_t lwflags, size_t *size, int32_t srid)
 {
 	uint8_t *start_ptr = data_ptr;
 	LWPOINT *point;
@@ -1243,7 +1219,7 @@ static LWPOINT* lwpoint_from_gserialized2_buffer(uint8_t *data_ptr, lwflags_t lw
 	assert(data_ptr);
 
 	point = (LWPOINT*)lwalloc(sizeof(LWPOINT));
-	point->srid = SRID_UNKNOWN; /* Default */
+	point->srid = srid;
 	point->bbox = NULL;
 	point->type = POINTTYPE;
 	point->flags = lwflags;
@@ -1265,7 +1241,8 @@ static LWPOINT* lwpoint_from_gserialized2_buffer(uint8_t *data_ptr, lwflags_t lw
 	return point;
 }
 
-static LWLINE* lwline_from_gserialized2_buffer(uint8_t *data_ptr, lwflags_t lwflags, size_t *size)
+static LWLINE *
+lwline_from_gserialized2_buffer(uint8_t *data_ptr, lwflags_t lwflags, size_t *size, int32_t srid)
 {
 	uint8_t *start_ptr = data_ptr;
 	LWLINE *line;
@@ -1274,7 +1251,7 @@ static LWLINE* lwline_from_gserialized2_buffer(uint8_t *data_ptr, lwflags_t lwfl
 	assert(data_ptr);
 
 	line = (LWLINE*)lwalloc(sizeof(LWLINE));
-	line->srid = SRID_UNKNOWN; /* Default */
+	line->srid = srid;
 	line->bbox = NULL;
 	line->type = LINETYPE;
 	line->flags = lwflags;
@@ -1297,7 +1274,8 @@ static LWLINE* lwline_from_gserialized2_buffer(uint8_t *data_ptr, lwflags_t lwfl
 	return line;
 }
 
-static LWPOLY* lwpoly_from_gserialized2_buffer(uint8_t *data_ptr, lwflags_t lwflags, size_t *size)
+static LWPOLY *
+lwpoly_from_gserialized2_buffer(uint8_t *data_ptr, lwflags_t lwflags, size_t *size, int32_t srid)
 {
 	uint8_t *start_ptr = data_ptr;
 	LWPOLY *poly;
@@ -1308,7 +1286,7 @@ static LWPOLY* lwpoly_from_gserialized2_buffer(uint8_t *data_ptr, lwflags_t lwfl
 	assert(data_ptr);
 
 	poly = (LWPOLY*)lwalloc(sizeof(LWPOLY));
-	poly->srid = SRID_UNKNOWN; /* Default */
+	poly->srid = srid;
 	poly->bbox = NULL;
 	poly->type = POLYGONTYPE;
 	poly->flags = lwflags;
@@ -1354,7 +1332,8 @@ static LWPOLY* lwpoly_from_gserialized2_buffer(uint8_t *data_ptr, lwflags_t lwfl
 	return poly;
 }
 
-static LWTRIANGLE* lwtriangle_from_gserialized2_buffer(uint8_t *data_ptr, lwflags_t lwflags, size_t *size)
+static LWTRIANGLE *
+lwtriangle_from_gserialized2_buffer(uint8_t *data_ptr, lwflags_t lwflags, size_t *size, int32_t srid)
 {
 	uint8_t *start_ptr = data_ptr;
 	LWTRIANGLE *triangle;
@@ -1363,7 +1342,7 @@ static LWTRIANGLE* lwtriangle_from_gserialized2_buffer(uint8_t *data_ptr, lwflag
 	assert(data_ptr);
 
 	triangle = (LWTRIANGLE*)lwalloc(sizeof(LWTRIANGLE));
-	triangle->srid = SRID_UNKNOWN; /* Default */
+	triangle->srid = srid; /* Default */
 	triangle->bbox = NULL;
 	triangle->type = TRIANGLETYPE;
 	triangle->flags = lwflags;
@@ -1385,7 +1364,8 @@ static LWTRIANGLE* lwtriangle_from_gserialized2_buffer(uint8_t *data_ptr, lwflag
 	return triangle;
 }
 
-static LWCIRCSTRING* lwcircstring_from_gserialized2_buffer(uint8_t *data_ptr, lwflags_t lwflags, size_t *size)
+static LWCIRCSTRING *
+lwcircstring_from_gserialized2_buffer(uint8_t *data_ptr, lwflags_t lwflags, size_t *size, int32_t srid)
 {
 	uint8_t *start_ptr = data_ptr;
 	LWCIRCSTRING *circstring;
@@ -1394,7 +1374,7 @@ static LWCIRCSTRING* lwcircstring_from_gserialized2_buffer(uint8_t *data_ptr, lw
 	assert(data_ptr);
 
 	circstring = (LWCIRCSTRING*)lwalloc(sizeof(LWCIRCSTRING));
-	circstring->srid = SRID_UNKNOWN; /* Default */
+	circstring->srid = srid;
 	circstring->bbox = NULL;
 	circstring->type = CIRCSTRINGTYPE;
 	circstring->flags = lwflags;
@@ -1416,7 +1396,8 @@ static LWCIRCSTRING* lwcircstring_from_gserialized2_buffer(uint8_t *data_ptr, lw
 	return circstring;
 }
 
-static LWCOLLECTION* lwcollection_from_gserialized2_buffer(uint8_t *data_ptr, lwflags_t lwflags, size_t *size)
+static LWCOLLECTION *
+lwcollection_from_gserialized2_buffer(uint8_t *data_ptr, lwflags_t lwflags, size_t *size, int32_t srid)
 {
 	uint32_t type;
 	uint8_t *start_ptr = data_ptr;
@@ -1430,7 +1411,7 @@ static LWCOLLECTION* lwcollection_from_gserialized2_buffer(uint8_t *data_ptr, lw
 	data_ptr += 4; /* Skip past the type. */
 
 	collection = (LWCOLLECTION*)lwalloc(sizeof(LWCOLLECTION));
-	collection->srid = SRID_UNKNOWN; /* Default */
+	collection->srid = srid;
 	collection->bbox = NULL;
 	collection->type = type;
 	collection->flags = lwflags;
@@ -1464,7 +1445,7 @@ static LWCOLLECTION* lwcollection_from_gserialized2_buffer(uint8_t *data_ptr, lw
 			lwfree(collection);
 			return NULL;
 		}
-		collection->geoms[i] = lwgeom_from_gserialized2_buffer(data_ptr, lwflags, &subsize);
+		collection->geoms[i] = lwgeom_from_gserialized2_buffer(data_ptr, lwflags, &subsize, srid);
 		data_ptr += subsize;
 	}
 
@@ -1474,7 +1455,8 @@ static LWCOLLECTION* lwcollection_from_gserialized2_buffer(uint8_t *data_ptr, lw
 	return collection;
 }
 
-LWGEOM* lwgeom_from_gserialized2_buffer(uint8_t *data_ptr, lwflags_t lwflags, size_t *g_size)
+LWGEOM *
+lwgeom_from_gserialized2_buffer(uint8_t *data_ptr, lwflags_t lwflags, size_t *g_size, int32_t srid)
 {
 	uint32_t type;
 
@@ -1488,15 +1470,15 @@ LWGEOM* lwgeom_from_gserialized2_buffer(uint8_t *data_ptr, lwflags_t lwflags, si
 	switch (type)
 	{
 	case POINTTYPE:
-		return (LWGEOM *)lwpoint_from_gserialized2_buffer(data_ptr, lwflags, g_size);
+		return (LWGEOM *)lwpoint_from_gserialized2_buffer(data_ptr, lwflags, g_size, srid);
 	case LINETYPE:
-		return (LWGEOM *)lwline_from_gserialized2_buffer(data_ptr, lwflags, g_size);
+		return (LWGEOM *)lwline_from_gserialized2_buffer(data_ptr, lwflags, g_size, srid);
 	case CIRCSTRINGTYPE:
-		return (LWGEOM *)lwcircstring_from_gserialized2_buffer(data_ptr, lwflags, g_size);
+		return (LWGEOM *)lwcircstring_from_gserialized2_buffer(data_ptr, lwflags, g_size, srid);
 	case POLYGONTYPE:
-		return (LWGEOM *)lwpoly_from_gserialized2_buffer(data_ptr, lwflags, g_size);
+		return (LWGEOM *)lwpoly_from_gserialized2_buffer(data_ptr, lwflags, g_size, srid);
 	case TRIANGLETYPE:
-		return (LWGEOM *)lwtriangle_from_gserialized2_buffer(data_ptr, lwflags, g_size);
+		return (LWGEOM *)lwtriangle_from_gserialized2_buffer(data_ptr, lwflags, g_size, srid);
 	case MULTIPOINTTYPE:
 	case MULTILINETYPE:
 	case MULTIPOLYGONTYPE:
@@ -1507,7 +1489,7 @@ LWGEOM* lwgeom_from_gserialized2_buffer(uint8_t *data_ptr, lwflags_t lwflags, si
 	case POLYHEDRALSURFACETYPE:
 	case TINTYPE:
 	case COLLECTIONTYPE:
-		return (LWGEOM *)lwcollection_from_gserialized2_buffer(data_ptr, lwflags, g_size);
+		return (LWGEOM *)lwcollection_from_gserialized2_buffer(data_ptr, lwflags, g_size, srid);
 	default:
 		lwerror("Unknown geometry type: %d - %s", type, lwtype_name(type));
 		return NULL;
@@ -1544,7 +1526,7 @@ LWGEOM* lwgeom_from_gserialized2(const GSERIALIZED *g)
 	if (FLAGS_GET_BBOX(lwflags))
 		data_ptr += gbox_serialized_size(lwflags);
 
-	lwgeom = lwgeom_from_gserialized2_buffer(data_ptr, lwflags, &size);
+	lwgeom = lwgeom_from_gserialized2_buffer(data_ptr, lwflags, &size, srid);
 
 	if (!lwgeom)
 		lwerror("%s: unable create geometry", __func__); /* Ooops! */
@@ -1565,8 +1547,6 @@ LWGEOM* lwgeom_from_gserialized2(const GSERIALIZED *g)
 		lwgeom->bbox = NULL;
 	}
 
-	lwgeom_set_srid(lwgeom, srid);
-
 	return lwgeom;
 }
 
diff --git a/libpgcommon/lwgeom_pg.c b/libpgcommon/lwgeom_pg.c
index aecc38a..4dbaa76 100644
--- a/libpgcommon/lwgeom_pg.c
+++ b/libpgcommon/lwgeom_pg.c
@@ -214,11 +214,6 @@ pg_alloc(size_t size)
 
 	POSTGIS_DEBUGF(5, "  pg_alloc(%d) returning %p", (int)size, result);
 
-	if ( ! result )
-	{
-		ereport(ERROR, (errmsg_internal("Out of virtual memory")));
-		return NULL;
-	}
 	return result;
 }
 
@@ -309,13 +304,12 @@ pg_install_lwgeom_handlers(void)
 */
 GSERIALIZED* geography_serialize(LWGEOM *lwgeom)
 {
-	size_t ret_size = 0;
-	GSERIALIZED *g = NULL;
+	size_t ret_size;
+	GSERIALIZED *g;
 	/** force to geodetic in case it's not **/
 	lwgeom_set_geodetic(lwgeom, true);
 
 	g = gserialized_from_lwgeom(lwgeom,  &ret_size);
-	if ( ! g ) lwpgerror("Unable to serialize lwgeom.");
 	SET_VARSIZE(g, ret_size);
 	return g;
 }
@@ -327,11 +321,10 @@ GSERIALIZED* geography_serialize(LWGEOM *lwgeom)
 */
 GSERIALIZED* geometry_serialize(LWGEOM *lwgeom)
 {
-	size_t ret_size = 0;
-	GSERIALIZED *g = NULL;
+	size_t ret_size;
+	GSERIALIZED *g;
 
 	g = gserialized_from_lwgeom(lwgeom, &ret_size);
-	if ( ! g ) lwpgerror("Unable to serialize lwgeom.");
 	SET_VARSIZE(g, ret_size);
 	return g;
 }
diff --git a/postgis/lwgeom_functions_basic.c b/postgis/lwgeom_functions_basic.c
index 1ed7942..369ea1e 100644
--- a/postgis/lwgeom_functions_basic.c
+++ b/postgis/lwgeom_functions_basic.c
@@ -1923,8 +1923,6 @@ Datum LWGEOM_noop(PG_FUNCTION_ARGS)
 	GSERIALIZED *in = PG_GETARG_GSERIALIZED_P(0);
 	LWGEOM *lwgeom = lwgeom_from_gserialized(in);
 	GSERIALIZED *out = geometry_serialize(lwgeom);
-	lwgeom_free(lwgeom);
-	PG_FREE_IF_COPY(in, 0);
 	PG_RETURN_POINTER(out);
 }
 

-----------------------------------------------------------------------

Summary of changes:
 NEWS                             |   1 +
 liblwgeom/gserialized2.c         | 118 ++++++++++++++++-----------------------
 libpgcommon/lwgeom_pg.c          |  15 ++---
 postgis/lwgeom_functions_basic.c |   2 -
 4 files changed, 54 insertions(+), 82 deletions(-)


hooks/post-receive
-- 
PostGIS


More information about the postgis-tickets mailing list