]> granicus.if.org Git - postgresql/commitdiff
Faster PageIsVerified() for the all zeroes case.
authorAndres Freund <andres@anarazel.de>
Fri, 9 Sep 2016 00:02:43 +0000 (17:02 -0700)
committerAndres Freund <andres@anarazel.de>
Fri, 9 Sep 2016 00:02:43 +0000 (17:02 -0700)
That's primarily useful for testing very large relations, using sparse
files.

Discussion: <20140331101001.GE13135@alap3.anarazel.de>
Reviewed-By: Peter Geoghegan
src/backend/storage/page/bufpage.c

index f2a07f211165205aae20f1e22c0039fc6adfcc93..1b70bfbe8cc1953616a634282463fb02749b70e8 100644 (file)
@@ -81,7 +81,7 @@ bool
 PageIsVerified(Page page, BlockNumber blkno)
 {
        PageHeader      p = (PageHeader) page;
-       char       *pagebytes;
+       size_t     *pagebytes;
        int                     i;
        bool            checksum_failure = false;
        bool            header_sane = false;
@@ -118,10 +118,17 @@ PageIsVerified(Page page, BlockNumber blkno)
                        return true;
        }
 
-       /* Check all-zeroes case */
+       /*
+        * Check all-zeroes case. Luckily BLCKSZ is guaranteed to always be a
+        * multiple of size_t - and it's much faster to compare memory using the
+        * native word size.
+        */
+       StaticAssertStmt(BLCKSZ == (BLCKSZ / sizeof(size_t)) * sizeof(size_t),
+                                        "BLCKSZ has to be a multiple of sizeof(size_t)");
+
        all_zeroes = true;
-       pagebytes = (char *) page;
-       for (i = 0; i < BLCKSZ; i++)
+       pagebytes = (size_t *) page;
+       for (i = 0; i < (BLCKSZ / sizeof(size_t)); i++)
        {
                if (pagebytes[i] != 0)
                {