diff options
author | Andres Freund <andres@anarazel.de> | 2016-09-08 17:02:43 -0700 |
---|---|---|
committer | Andres Freund <andres@anarazel.de> | 2016-09-08 17:02:43 -0700 |
commit | 417fefaf089fc0b73607cbbe8bcd0bc9e89d08ef (patch) | |
tree | 021b48dc799c519b22b77a643ac68013c3c20dda | |
parent | 769fd9d8e06bf862334a0e04134a3d2c665e5e5b (diff) | |
download | postgresql-417fefaf089fc0b73607cbbe8bcd0bc9e89d08ef.tar.gz postgresql-417fefaf089fc0b73607cbbe8bcd0bc9e89d08ef.zip |
Faster PageIsVerified() for the all zeroes case.
That's primarily useful for testing very large relations, using sparse
files.
Discussion: <20140331101001.GE13135@alap3.anarazel.de>
Reviewed-By: Peter Geoghegan
-rw-r--r-- | src/backend/storage/page/bufpage.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/src/backend/storage/page/bufpage.c b/src/backend/storage/page/bufpage.c index f2a07f21116..1b70bfbe8cc 100644 --- a/src/backend/storage/page/bufpage.c +++ b/src/backend/storage/page/bufpage.c @@ -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) { |