Faster PageIsVerified() for the all zeroes case.
authorAndres Freund <[email protected]>
Fri, 9 Sep 2016 00:02:43 +0000 (17:02 -0700)
committerAndres Freund <[email protected]>
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[email protected]>
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)
        {