Split benchmarks for full / partial initialization
diff --git a/cmd/wuffs-c/internal/cgen/base/core-public.h b/cmd/wuffs-c/internal/cgen/base/core-public.h
index 7564c53..24be7df 100644
--- a/cmd/wuffs-c/internal/cgen/base/core-public.h
+++ b/cmd/wuffs-c/internal/cgen/base/core-public.h
@@ -68,6 +68,8 @@
 
 // Flags for wuffs_foo__bar__initialize functions.
 
+#define WUFFS_INITIALIZE__DEFAULT_OPTIONS ((uint32_t)0x00000000)
+
 // WUFFS_INITIALIZE__ALREADY_ZEROED means that the "self" receiver struct value
 // has already been set to all zeroes.
 #define WUFFS_INITIALIZE__ALREADY_ZEROED ((uint32_t)0x00000001)
diff --git a/cmd/wuffs-c/internal/cgen/data.go b/cmd/wuffs-c/internal/cgen/data.go
index d957cc8..7504e10 100644
--- a/cmd/wuffs-c/internal/cgen/data.go
+++ b/cmd/wuffs-c/internal/cgen/data.go
@@ -63,8 +63,8 @@
 const baseCorePublicH = "" +
 	"// Wuffs assumes that:\n//  - converting a uint32_t to a size_t will never overflow.\n//  - converting a size_t to a uint64_t will never overflow.\n#ifdef __WORDSIZE\n#if (__WORDSIZE != 32) && (__WORDSIZE != 64)\n#error \"Wuffs requires a word size of either 32 or 64 bits\"\n#endif\n#endif\n\n// WUFFS_VERSION is the major.minor.patch version, as per https://semver.org/,\n// as a uint64_t. The major number is the high 32 bits. The minor number is the\n// middle 16 bits. The patch number is the low 16 bits. The pre-release label\n// and build metadata are part of the string representation (such as\n// \"1.2.3-beta+456.20181231\") but not the uint64_t representation.\n//\n// WUFFS_VERSION_PRE_RELEASE_LABEL (such as \"\", \"beta\" or \"rc.1\") being\n// non-empty denotes a developer preview, not a release version, and has no\n// backwards or forwards compatibility guarantees.\n//\n// WUFFS_VERSION_BUILD_METADATA_XXX, if non-zero, are the number of commits and\n// the last commit date in the repository used to build this library. Within\n// eac" +
 	"h major.minor branch, the commit count should increase monotonically.\n//\n// !! Some code generation programs can override WUFFS_VERSION.\n#define WUFFS_VERSION ((uint64_t)0)\n#define WUFFS_VERSION_MAJOR ((uint64_t)0)\n#define WUFFS_VERSION_MINOR ((uint64_t)0)\n#define WUFFS_VERSION_PATCH ((uint64_t)0)\n#define WUFFS_VERSION_PRE_RELEASE_LABEL \"work.in.progress\"\n#define WUFFS_VERSION_BUILD_METADATA_COMMIT_COUNT 0\n#define WUFFS_VERSION_BUILD_METADATA_COMMIT_DATE 0\n#define WUFFS_VERSION_STRING \"0.0.0+0.00000000\"\n\n// Define WUFFS_CONFIG__STATIC_FUNCTIONS to make all of Wuffs' functions have\n// static storage. The motivation is discussed in the \"ALLOW STATIC\n// IMPLEMENTATION\" section of\n// https://raw.githubusercontent.com/nothings/stb/master/docs/stb_howto.txt\n#ifdef WUFFS_CONFIG__STATIC_FUNCTIONS\n#define WUFFS_BASE__MAYBE_STATIC static\n#else\n#define WUFFS_BASE__MAYBE_STATIC\n#endif\n\n// Clang also defines \"__GNUC__\".\n#if defined(__GNUC__)\n#define WUFFS_BASE__POTENTIALLY_UNUSED __attribute__((unused))\n#define WUFFS_BASE" +
-	"__WARN_UNUSED_RESULT __attribute__((warn_unused_result))\n#else\n#define WUFFS_BASE__POTENTIALLY_UNUSED\n#define WUFFS_BASE__WARN_UNUSED_RESULT\n#endif\n\n// Flags for wuffs_foo__bar__initialize functions.\n\n// WUFFS_INITIALIZE__ALREADY_ZEROED means that the \"self\" receiver struct value\n// has already been set to all zeroes.\n#define WUFFS_INITIALIZE__ALREADY_ZEROED ((uint32_t)0x00000001)\n\n// WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED means that, absent\n// WUFFS_INITIALIZE__ALREADY_ZEROED, only some of the \"self\" receiver struct\n// value will be set to all zeroes. Internal buffers, which tend to be a large\n// proportion of the struct's size, will be left uninitialized. Internal means\n// that the buffer is contained by the receiver struct, as opposed to being\n// passed as a separately allocated \"work buffer\".\n//\n// With or without this bit set, the Wuffs compiler still enforces that no\n// reads or writes will overflow internal buffers' bounds. Even with this bit\n// set, the Wuffs standard library also cons" +
-	"iders reading from an uninitialized\n// buffer to be a bug, and strives to never do so, but unlike buffer overflows,\n// it is not a bug class that the Wuffs compiler eliminates.\n//\n// For those paranoid about security, leave this bit unset, so that\n// wuffs_foo__bar__initialize will initialize the entire struct value to zeroes\n// (unless WUFFS_INITIALIZE__ALREADY_ZEROED is set).\n//\n// Setting this bit gives a small absolute improvement on micro-benchmarks, but\n// this can be a large relative effect, up to 2x faster, when the actual work\n// to be done is also small, such as decompressing small input. See git commit\n// 438fc105 \"Move some struct fields to private_data\" for some numbers and a\n// discussion, noting that its commit message was written before this\n// WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED option was defined.\n#define WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED \\\n  ((uint32_t)0x00000002)\n\n" +
+	"__WARN_UNUSED_RESULT __attribute__((warn_unused_result))\n#else\n#define WUFFS_BASE__POTENTIALLY_UNUSED\n#define WUFFS_BASE__WARN_UNUSED_RESULT\n#endif\n\n// Flags for wuffs_foo__bar__initialize functions.\n\n#define WUFFS_INITIALIZE__DEFAULT_OPTIONS ((uint32_t)0x00000000)\n\n// WUFFS_INITIALIZE__ALREADY_ZEROED means that the \"self\" receiver struct value\n// has already been set to all zeroes.\n#define WUFFS_INITIALIZE__ALREADY_ZEROED ((uint32_t)0x00000001)\n\n// WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED means that, absent\n// WUFFS_INITIALIZE__ALREADY_ZEROED, only some of the \"self\" receiver struct\n// value will be set to all zeroes. Internal buffers, which tend to be a large\n// proportion of the struct's size, will be left uninitialized. Internal means\n// that the buffer is contained by the receiver struct, as opposed to being\n// passed as a separately allocated \"work buffer\".\n//\n// With or without this bit set, the Wuffs compiler still enforces that no\n// reads or writes will overflow internal buffers' bound" +
+	"s. Even with this bit\n// set, the Wuffs standard library also considers reading from an uninitialized\n// buffer to be a bug, and strives to never do so, but unlike buffer overflows,\n// it is not a bug class that the Wuffs compiler eliminates.\n//\n// For those paranoid about security, leave this bit unset, so that\n// wuffs_foo__bar__initialize will initialize the entire struct value to zeroes\n// (unless WUFFS_INITIALIZE__ALREADY_ZEROED is set).\n//\n// Setting this bit gives a small absolute improvement on micro-benchmarks, but\n// this can be a large relative effect, up to 2x faster, when the actual work\n// to be done is also small, such as decompressing small input. See git commit\n// 438fc105 \"Move some struct fields to private_data\" for some numbers and a\n// discussion, noting that its commit message was written before this\n// WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED option was defined.\n#define WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED \\\n  ((uint32_t)0x00000002)\n\n" +
 	"" +
 	"// --------\n\n// wuffs_base__empty_struct is used when a Wuffs function returns an empty\n// struct. In C, if a function f returns void, you can't say \"x = f()\", but in\n// Wuffs, if a function g returns empty, you can say \"y = g()\".\ntypedef struct {\n  // private_impl is a placeholder field. It isn't explicitly used, except that\n  // without it, the sizeof a struct with no fields can differ across C/C++\n  // compilers, and it is undefined behavior in C99. For example, gcc says that\n  // the sizeof an empty struct is 0, and g++ says that it is 1. This leads to\n  // ABI incompatibility if a Wuffs .c file is processed by one compiler and\n  // its .h file with another compiler.\n  //\n  // Instead, we explicitly insert an otherwise unused field, so that the\n  // sizeof this struct is always 1.\n  uint8_t private_impl;\n} wuffs_base__empty_struct;\n\n// wuffs_base__utility is a placeholder receiver type. It enables what Java\n// calls static methods, as opposed to regular methods.\ntypedef struct {\n  // private_impl is a pla" +
 	"ceholder field. It isn't explicitly used, except that\n  // without it, the sizeof a struct with no fields can differ across C/C++\n  // compilers, and it is undefined behavior in C99. For example, gcc says that\n  // the sizeof an empty struct is 0, and g++ says that it is 1. This leads to\n  // ABI incompatibility if a Wuffs .c file is processed by one compiler and\n  // its .h file with another compiler.\n  //\n  // Instead, we explicitly insert an otherwise unused field, so that the\n  // sizeof this struct is always 1.\n  uint8_t private_impl;\n} wuffs_base__utility;\n\n" +
diff --git a/release/c/wuffs-unsupported-snapshot.c b/release/c/wuffs-unsupported-snapshot.c
index bb4fa0a..028dedc 100644
--- a/release/c/wuffs-unsupported-snapshot.c
+++ b/release/c/wuffs-unsupported-snapshot.c
@@ -84,6 +84,8 @@
 
 // Flags for wuffs_foo__bar__initialize functions.
 
+#define WUFFS_INITIALIZE__DEFAULT_OPTIONS ((uint32_t)0x00000000)
+
 // WUFFS_INITIALIZE__ALREADY_ZEROED means that the "self" receiver struct value
 // has already been set to all zeroes.
 #define WUFFS_INITIALIZE__ALREADY_ZEROED ((uint32_t)0x00000001)
diff --git a/test/c/mimiclib/deflate-gzip-zlib.c b/test/c/mimiclib/deflate-gzip-zlib.c
index 61db7aa..9b9c0c3 100644
--- a/test/c/mimiclib/deflate-gzip-zlib.c
+++ b/test/c/mimiclib/deflate-gzip-zlib.c
@@ -22,6 +22,7 @@
 
 const char* mimic_bench_adler32(wuffs_base__io_buffer* dst,
                                 wuffs_base__io_buffer* src,
+                                uint32_t wuffs_initialize_flags,
                                 uint64_t wlimit,
                                 uint64_t rlimit) {
   return "miniz does not independently compute Adler32";
@@ -29,6 +30,7 @@
 
 const char* mimic_bench_crc32_ieee(wuffs_base__io_buffer* dst,
                                    wuffs_base__io_buffer* src,
+                                   uint32_t wuffs_initialize_flags,
                                    uint64_t wlimit,
                                    uint64_t rlimit) {
   return "miniz does not implement CRC32/IEEE";
@@ -36,6 +38,7 @@
 
 const char* mimic_deflate_zlib_decode(wuffs_base__io_buffer* dst,
                                       wuffs_base__io_buffer* src,
+                                      uint32_t wuffs_initialize_flags,
                                       uint64_t wlimit,
                                       uint64_t rlimit,
                                       bool deflate_instead_of_zlib) {
@@ -87,6 +90,7 @@
 
 const char* mimic_bench_adler32(wuffs_base__io_buffer* dst,
                                 wuffs_base__io_buffer* src,
+                                uint32_t wuffs_initialize_flags,
                                 uint64_t wlimit,
                                 uint64_t rlimit) {
   global_mimiclib_deflate_unused_u32 = 0;
@@ -107,6 +111,7 @@
 
 const char* mimic_bench_crc32_ieee(wuffs_base__io_buffer* dst,
                                    wuffs_base__io_buffer* src,
+                                   uint32_t wuffs_initialize_flags,
                                    uint64_t wlimit,
                                    uint64_t rlimit) {
   global_mimiclib_deflate_unused_u32 = 0;
@@ -223,6 +228,7 @@
 
 const char* mimic_deflate_decode(wuffs_base__io_buffer* dst,
                                  wuffs_base__io_buffer* src,
+                                 uint32_t wuffs_initialize_flags,
                                  uint64_t wlimit,
                                  uint64_t rlimit) {
   return mimic_deflate_gzip_zlib_decode(dst, src, wlimit, rlimit,
@@ -231,6 +237,7 @@
 
 const char* mimic_gzip_decode(wuffs_base__io_buffer* dst,
                               wuffs_base__io_buffer* src,
+                              uint32_t wuffs_initialize_flags,
                               uint64_t wlimit,
                               uint64_t rlimit) {
   return mimic_deflate_gzip_zlib_decode(dst, src, wlimit, rlimit,
@@ -239,6 +246,7 @@
 
 const char* mimic_zlib_decode(wuffs_base__io_buffer* dst,
                               wuffs_base__io_buffer* src,
+                              uint32_t wuffs_initialize_flags,
                               uint64_t wlimit,
                               uint64_t rlimit) {
   return mimic_deflate_gzip_zlib_decode(dst, src, wlimit, rlimit,
diff --git a/test/c/mimiclib/gif.c b/test/c/mimiclib/gif.c
index f9caed4..3e190fd 100644
--- a/test/c/mimiclib/gif.c
+++ b/test/c/mimiclib/gif.c
@@ -30,6 +30,7 @@
 }
 
 const char* mimic_gif_decode(wuffs_base__io_buffer* dst,
+                             uint32_t wuffs_initialize_flags,
                              wuffs_base__pixel_format pixfmt,
                              wuffs_base__io_buffer* src) {
   const char* ret = NULL;
diff --git a/test/c/std/adler32.c b/test/c/std/adler32.c
index b0833b6..9e509a9 100644
--- a/test/c/std/adler32.c
+++ b/test/c/std/adler32.c
@@ -226,6 +226,7 @@
 
 const char* wuffs_bench_adler32(wuffs_base__io_buffer* dst,
                                 wuffs_base__io_buffer* src,
+                                uint32_t wuffs_initialize_flags,
                                 uint64_t wlimit,
                                 uint64_t rlimit) {
   uint64_t len = src->meta.wi - src->meta.ri;
@@ -234,8 +235,7 @@
   }
   wuffs_adler32__hasher checksum;
   const char* status = wuffs_adler32__hasher__initialize(
-      &checksum, sizeof checksum, WUFFS_VERSION,
-      WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED);
+      &checksum, sizeof checksum, WUFFS_VERSION, wuffs_initialize_flags);
   if (status) {
     return status;
   }
@@ -250,14 +250,18 @@
 
 const char* bench_wuffs_adler32_10k() {
   CHECK_FOCUS(__func__);
-  return do_bench_io_buffers(wuffs_bench_adler32, tc_src, &adler32_midsummer_gt,
-                             0, 0, 1500);
+  return do_bench_io_buffers(
+      wuffs_bench_adler32,
+      WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED, tc_src,
+      &adler32_midsummer_gt, 0, 0, 1500);
 }
 
 const char* bench_wuffs_adler32_100k() {
   CHECK_FOCUS(__func__);
-  return do_bench_io_buffers(wuffs_bench_adler32, tc_src, &adler32_pi_gt, 0, 0,
-                             150);
+  return do_bench_io_buffers(
+      wuffs_bench_adler32,
+      WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED, tc_src,
+      &adler32_pi_gt, 0, 0, 150);
 }
 
   // ---------------- Mimic Benches
@@ -266,14 +270,14 @@
 
 const char* bench_mimic_adler32_10k() {
   CHECK_FOCUS(__func__);
-  return do_bench_io_buffers(mimic_bench_adler32, tc_src, &adler32_midsummer_gt,
-                             0, 0, 1500);
+  return do_bench_io_buffers(mimic_bench_adler32, 0, tc_src,
+                             &adler32_midsummer_gt, 0, 0, 1500);
 }
 
 const char* bench_mimic_adler32_100k() {
   CHECK_FOCUS(__func__);
-  return do_bench_io_buffers(mimic_bench_adler32, tc_src, &adler32_pi_gt, 0, 0,
-                             150);
+  return do_bench_io_buffers(mimic_bench_adler32, 0, tc_src, &adler32_pi_gt, 0,
+                             0, 150);
 }
 
 #endif  // WUFFS_MIMIC
diff --git a/test/c/std/crc32.c b/test/c/std/crc32.c
index c477676..b2c395d 100644
--- a/test/c/std/crc32.c
+++ b/test/c/std/crc32.c
@@ -261,6 +261,7 @@
 
 const char* wuffs_bench_crc32_ieee(wuffs_base__io_buffer* dst,
                                    wuffs_base__io_buffer* src,
+                                   uint32_t wuffs_initialize_flags,
                                    uint64_t wlimit,
                                    uint64_t rlimit) {
   uint64_t len = src->meta.wi - src->meta.ri;
@@ -269,8 +270,7 @@
   }
   wuffs_crc32__ieee_hasher checksum;
   const char* status = wuffs_crc32__ieee_hasher__initialize(
-      &checksum, sizeof checksum, WUFFS_VERSION,
-      WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED);
+      &checksum, sizeof checksum, WUFFS_VERSION, wuffs_initialize_flags);
   if (status) {
     return status;
   }
@@ -285,14 +285,18 @@
 
 const char* bench_wuffs_crc32_ieee_10k() {
   CHECK_FOCUS(__func__);
-  return do_bench_io_buffers(wuffs_bench_crc32_ieee, tc_src,
-                             &crc32_midsummer_gt, 0, 0, 1500);
+  return do_bench_io_buffers(
+      wuffs_bench_crc32_ieee,
+      WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED, tc_src,
+      &crc32_midsummer_gt, 0, 0, 1500);
 }
 
 const char* bench_wuffs_crc32_ieee_100k() {
   CHECK_FOCUS(__func__);
-  return do_bench_io_buffers(wuffs_bench_crc32_ieee, tc_src, &crc32_pi_gt, 0, 0,
-                             150);
+  return do_bench_io_buffers(
+      wuffs_bench_crc32_ieee,
+      WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED, tc_src,
+      &crc32_pi_gt, 0, 0, 150);
 }
 
   // ---------------- Mimic Benches
@@ -301,14 +305,14 @@
 
 const char* bench_mimic_crc32_ieee_10k() {
   CHECK_FOCUS(__func__);
-  return do_bench_io_buffers(mimic_bench_crc32_ieee, tc_src,
+  return do_bench_io_buffers(mimic_bench_crc32_ieee, 0, tc_src,
                              &crc32_midsummer_gt, 0, 0, 1500);
 }
 
 const char* bench_mimic_crc32_ieee_100k() {
   CHECK_FOCUS(__func__);
-  return do_bench_io_buffers(mimic_bench_crc32_ieee, tc_src, &crc32_pi_gt, 0, 0,
-                             150);
+  return do_bench_io_buffers(mimic_bench_crc32_ieee, 0, tc_src, &crc32_pi_gt, 0,
+                             0, 150);
 }
 
 #endif  // WUFFS_MIMIC
diff --git a/test/c/std/deflate.c b/test/c/std/deflate.c
index 082b82a..b011709 100644
--- a/test/c/std/deflate.c
+++ b/test/c/std/deflate.c
@@ -137,12 +137,12 @@
 
 const char* wuffs_deflate_decode(wuffs_base__io_buffer* dst,
                                  wuffs_base__io_buffer* src,
+                                 uint32_t wuffs_initialize_flags,
                                  uint64_t wlimit,
                                  uint64_t rlimit) {
   wuffs_deflate__decoder dec;
   const char* status = wuffs_deflate__decoder__initialize(
-      &dec, sizeof dec, WUFFS_VERSION,
-      WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED);
+      &dec, sizeof dec, WUFFS_VERSION, wuffs_initialize_flags);
   if (status) {
     RETURN_FAIL("initialize: \"%s\"", status);
   }
@@ -680,28 +680,50 @@
 
 // ---------------- Deflate Benches
 
-const char* bench_wuffs_deflate_decode_1k() {
+const char* bench_wuffs_deflate_decode_1k_full_init() {
   CHECK_FOCUS(__func__);
-  return do_bench_io_buffers(wuffs_deflate_decode, tc_dst, &deflate_romeo_gt, 0,
-                             0, 2000);
+  return do_bench_io_buffers(wuffs_deflate_decode,
+                             WUFFS_INITIALIZE__DEFAULT_OPTIONS, tc_dst,
+                             &deflate_romeo_gt, 0, 0, 2000);
 }
 
-const char* bench_wuffs_deflate_decode_10k() {
+const char* bench_wuffs_deflate_decode_1k_part_init() {
   CHECK_FOCUS(__func__);
-  return do_bench_io_buffers(wuffs_deflate_decode, tc_dst,
+  return do_bench_io_buffers(
+      wuffs_deflate_decode,
+      WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED, tc_dst,
+      &deflate_romeo_gt, 0, 0, 2000);
+}
+
+const char* bench_wuffs_deflate_decode_10k_full_init() {
+  CHECK_FOCUS(__func__);
+  return do_bench_io_buffers(wuffs_deflate_decode,
+                             WUFFS_INITIALIZE__DEFAULT_OPTIONS, tc_dst,
                              &deflate_midsummer_gt, 0, 0, 300);
 }
 
+const char* bench_wuffs_deflate_decode_10k_part_init() {
+  CHECK_FOCUS(__func__);
+  return do_bench_io_buffers(
+      wuffs_deflate_decode,
+      WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED, tc_dst,
+      &deflate_midsummer_gt, 0, 0, 300);
+}
+
 const char* bench_wuffs_deflate_decode_100k_just_one_read() {
   CHECK_FOCUS(__func__);
-  return do_bench_io_buffers(wuffs_deflate_decode, tc_dst, &deflate_pi_gt, 0, 0,
-                             30);
+  return do_bench_io_buffers(
+      wuffs_deflate_decode,
+      WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED, tc_dst,
+      &deflate_pi_gt, 0, 0, 30);
 }
 
 const char* bench_wuffs_deflate_decode_100k_many_big_reads() {
   CHECK_FOCUS(__func__);
-  return do_bench_io_buffers(wuffs_deflate_decode, tc_dst, &deflate_pi_gt, 0,
-                             4096, 30);
+  return do_bench_io_buffers(
+      wuffs_deflate_decode,
+      WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED, tc_dst,
+      &deflate_pi_gt, 0, 4096, 30);
 }
 
   // ---------------- Mimic Benches
@@ -710,25 +732,25 @@
 
 const char* bench_mimic_deflate_decode_1k() {
   CHECK_FOCUS(__func__);
-  return do_bench_io_buffers(mimic_deflate_decode, tc_dst, &deflate_romeo_gt, 0,
-                             0, 2000);
+  return do_bench_io_buffers(mimic_deflate_decode, 0, tc_dst, &deflate_romeo_gt,
+                             0, 0, 2000);
 }
 
 const char* bench_mimic_deflate_decode_10k() {
   CHECK_FOCUS(__func__);
-  return do_bench_io_buffers(mimic_deflate_decode, tc_dst,
+  return do_bench_io_buffers(mimic_deflate_decode, 0, tc_dst,
                              &deflate_midsummer_gt, 0, 0, 300);
 }
 
 const char* bench_mimic_deflate_decode_100k_just_one_read() {
   CHECK_FOCUS(__func__);
-  return do_bench_io_buffers(mimic_deflate_decode, tc_dst, &deflate_pi_gt, 0, 0,
-                             30);
+  return do_bench_io_buffers(mimic_deflate_decode, 0, tc_dst, &deflate_pi_gt, 0,
+                             0, 30);
 }
 
 const char* bench_mimic_deflate_decode_100k_many_big_reads() {
   CHECK_FOCUS(__func__);
-  return do_bench_io_buffers(mimic_deflate_decode, tc_dst, &deflate_pi_gt, 0,
+  return do_bench_io_buffers(mimic_deflate_decode, 0, tc_dst, &deflate_pi_gt, 0,
                              4096, 30);
 }
 
@@ -775,8 +797,10 @@
 // The empty comments forces clang-format to place one element per line.
 proc benches[] = {
 
-    bench_wuffs_deflate_decode_1k,                   //
-    bench_wuffs_deflate_decode_10k,                  //
+    bench_wuffs_deflate_decode_1k_full_init,         //
+    bench_wuffs_deflate_decode_1k_part_init,         //
+    bench_wuffs_deflate_decode_10k_full_init,        //
+    bench_wuffs_deflate_decode_10k_part_init,        //
     bench_wuffs_deflate_decode_100k_just_one_read,   //
     bench_wuffs_deflate_decode_100k_many_big_reads,  //
 
diff --git a/test/c/std/gif.c b/test/c/std/gif.c
index 433a878..6ed3277 100644
--- a/test/c/std/gif.c
+++ b/test/c/std/gif.c
@@ -193,12 +193,12 @@
 // ---------------- GIF Tests
 
 const char* wuffs_gif_decode(wuffs_base__io_buffer* dst,
+                             uint32_t wuffs_initialize_flags,
                              wuffs_base__pixel_format pixfmt,
                              wuffs_base__io_buffer* src) {
   wuffs_gif__decoder dec;
   const char* status = wuffs_gif__decoder__initialize(
-      &dec, sizeof dec, WUFFS_VERSION,
-      WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED);
+      &dec, sizeof dec, WUFFS_VERSION, wuffs_initialize_flags);
   if (status) {
     return status;
   }
@@ -1402,7 +1402,7 @@
       .data = global_got_slice,
   });
   status = wuffs_gif_decode(
-      &got, WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY, &src);
+      &got, 0, WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY, &src);
   if (status) {
     return status;
   }
@@ -1412,7 +1412,7 @@
       .data = global_want_slice,
   });
   status = mimic_gif_decode(
-      &want, WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY, &src);
+      &want, 0, WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY, &src);
   if (status) {
     return status;
   }
@@ -1499,8 +1499,10 @@
 
 const char* do_bench_gif_decode(
     const char* (*decode_func)(wuffs_base__io_buffer*,
+                               uint32_t wuffs_initialize_flags,
                                wuffs_base__pixel_format,
                                wuffs_base__io_buffer*),
+    uint32_t wuffs_initialize_flags,
     const char* filename,
     wuffs_base__pixel_format pixfmt,
     uint64_t iters_unscaled) {
@@ -1523,7 +1525,7 @@
   for (i = 0; i < iters; i++) {
     got.meta.wi = 0;
     src.meta.ri = 0;
-    status = decode_func(&got, pixfmt, &src);
+    status = decode_func(&got, wuffs_initialize_flags, pixfmt, &src);
     if (status) {
       return status;
     }
@@ -1535,63 +1537,88 @@
 
 const char* bench_wuffs_gif_decode_1k_bw() {
   CHECK_FOCUS(__func__);
-  return do_bench_gif_decode(wuffs_gif_decode, "test/data/pjw-thumbnail.gif",
-                             WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY,
-                             2000);
+  return do_bench_gif_decode(
+      wuffs_gif_decode, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED,
+      "test/data/pjw-thumbnail.gif",
+      WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY, 2000);
 }
 
-const char* bench_wuffs_gif_decode_1k_color() {
+const char* bench_wuffs_gif_decode_1k_color_full_init() {
   CHECK_FOCUS(__func__);
   return do_bench_gif_decode(
-      wuffs_gif_decode, "test/data/hippopotamus.regular.gif",
+      wuffs_gif_decode, WUFFS_INITIALIZE__DEFAULT_OPTIONS,
+      "test/data/hippopotamus.regular.gif",
+      WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY, 1000);
+}
+
+const char* bench_wuffs_gif_decode_1k_color_part_init() {
+  CHECK_FOCUS(__func__);
+  return do_bench_gif_decode(
+      wuffs_gif_decode, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED,
+      "test/data/hippopotamus.regular.gif",
       WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY, 1000);
 }
 
 const char* bench_wuffs_gif_decode_10k_bgra() {
   CHECK_FOCUS(__func__);
-  return do_bench_gif_decode(wuffs_gif_decode, "test/data/hat.gif",
-                             WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL, 100);
+  return do_bench_gif_decode(
+      wuffs_gif_decode, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED,
+      "test/data/hat.gif", WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL, 100);
 }
 
 const char* bench_wuffs_gif_decode_10k_indexed() {
   CHECK_FOCUS(__func__);
-  return do_bench_gif_decode(wuffs_gif_decode, "test/data/hat.gif",
-                             WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY,
-                             100);
+  return do_bench_gif_decode(
+      wuffs_gif_decode, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED,
+      "test/data/hat.gif", WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY, 100);
 }
 
 const char* bench_wuffs_gif_decode_20k() {
   CHECK_FOCUS(__func__);
-  return do_bench_gif_decode(wuffs_gif_decode, "test/data/bricks-gray.gif",
-                             WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY,
-                             50);
+  return do_bench_gif_decode(
+      wuffs_gif_decode, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED,
+      "test/data/bricks-gray.gif",
+      WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY, 50);
 }
 
 const char* bench_wuffs_gif_decode_100k_artificial() {
   CHECK_FOCUS(__func__);
   return do_bench_gif_decode(
-      wuffs_gif_decode, "test/data/hibiscus.primitive.gif",
+      wuffs_gif_decode, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED,
+      "test/data/hibiscus.primitive.gif",
       WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY, 15);
 }
 
 const char* bench_wuffs_gif_decode_100k_realistic() {
   CHECK_FOCUS(__func__);
-  return do_bench_gif_decode(wuffs_gif_decode, "test/data/hibiscus.regular.gif",
-                             WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY,
-                             10);
+  return do_bench_gif_decode(
+      wuffs_gif_decode, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED,
+      "test/data/hibiscus.regular.gif",
+      WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY, 10);
 }
 
-const char* bench_wuffs_gif_decode_1000k() {
+const char* bench_wuffs_gif_decode_1000k_full_init() {
   CHECK_FOCUS(__func__);
-  return do_bench_gif_decode(wuffs_gif_decode, "test/data/harvesters.gif",
+  return do_bench_gif_decode(wuffs_gif_decode,
+                             WUFFS_INITIALIZE__DEFAULT_OPTIONS,
+                             "test/data/harvesters.gif",
                              WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY, 1);
 }
 
+const char* bench_wuffs_gif_decode_1000k_part_init() {
+  CHECK_FOCUS(__func__);
+  return do_bench_gif_decode(
+      wuffs_gif_decode, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED,
+      "test/data/harvesters.gif",
+      WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY, 1);
+}
+
 const char* bench_wuffs_gif_decode_anim_screencap() {
   CHECK_FOCUS(__func__);
-  return do_bench_gif_decode(wuffs_gif_decode,
-                             "test/data/gifplayer-muybridge.gif",
-                             WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY, 1);
+  return do_bench_gif_decode(
+      wuffs_gif_decode, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED,
+      "test/data/gifplayer-muybridge.gif",
+      WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY, 1);
 }
 
   // ---------------- Mimic Benches
@@ -1600,7 +1627,7 @@
 
 const char* bench_mimic_gif_decode_1k_bw() {
   CHECK_FOCUS(__func__);
-  return do_bench_gif_decode(mimic_gif_decode, "test/data/pjw-thumbnail.gif",
+  return do_bench_gif_decode(mimic_gif_decode, 0, "test/data/pjw-thumbnail.gif",
                              WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY,
                              2000);
 }
@@ -1608,20 +1635,20 @@
 const char* bench_mimic_gif_decode_1k_color() {
   CHECK_FOCUS(__func__);
   return do_bench_gif_decode(
-      mimic_gif_decode, "test/data/hippopotamus.regular.gif",
+      mimic_gif_decode, 0, "test/data/hippopotamus.regular.gif",
       WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY, 1000);
 }
 
 const char* bench_mimic_gif_decode_10k_indexed() {
   CHECK_FOCUS(__func__);
-  return do_bench_gif_decode(mimic_gif_decode, "test/data/hat.gif",
+  return do_bench_gif_decode(mimic_gif_decode, 0, "test/data/hat.gif",
                              WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY,
                              100);
 }
 
 const char* bench_mimic_gif_decode_20k() {
   CHECK_FOCUS(__func__);
-  return do_bench_gif_decode(mimic_gif_decode, "test/data/bricks-gray.gif",
+  return do_bench_gif_decode(mimic_gif_decode, 0, "test/data/bricks-gray.gif",
                              WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY,
                              50);
 }
@@ -1629,26 +1656,26 @@
 const char* bench_mimic_gif_decode_100k_artificial() {
   CHECK_FOCUS(__func__);
   return do_bench_gif_decode(
-      mimic_gif_decode, "test/data/hibiscus.primitive.gif",
+      mimic_gif_decode, 0, "test/data/hibiscus.primitive.gif",
       WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY, 15);
 }
 
 const char* bench_mimic_gif_decode_100k_realistic() {
   CHECK_FOCUS(__func__);
-  return do_bench_gif_decode(mimic_gif_decode, "test/data/hibiscus.regular.gif",
-                             WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY,
-                             10);
+  return do_bench_gif_decode(
+      mimic_gif_decode, 0, "test/data/hibiscus.regular.gif",
+      WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY, 10);
 }
 
 const char* bench_mimic_gif_decode_1000k() {
   CHECK_FOCUS(__func__);
-  return do_bench_gif_decode(mimic_gif_decode, "test/data/harvesters.gif",
+  return do_bench_gif_decode(mimic_gif_decode, 0, "test/data/harvesters.gif",
                              WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY, 1);
 }
 
 const char* bench_mimic_gif_decode_anim_screencap() {
   CHECK_FOCUS(__func__);
-  return do_bench_gif_decode(mimic_gif_decode,
+  return do_bench_gif_decode(mimic_gif_decode, 0,
                              "test/data/gifplayer-muybridge.gif",
                              WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY, 1);
 }
@@ -1719,15 +1746,17 @@
 // The empty comments forces clang-format to place one element per line.
 proc benches[] = {
 
-    bench_wuffs_gif_decode_1k_bw,            //
-    bench_wuffs_gif_decode_1k_color,         //
-    bench_wuffs_gif_decode_10k_bgra,         //
-    bench_wuffs_gif_decode_10k_indexed,      //
-    bench_wuffs_gif_decode_20k,              //
-    bench_wuffs_gif_decode_100k_artificial,  //
-    bench_wuffs_gif_decode_100k_realistic,   //
-    bench_wuffs_gif_decode_1000k,            //
-    bench_wuffs_gif_decode_anim_screencap,   //
+    bench_wuffs_gif_decode_1k_bw,               //
+    bench_wuffs_gif_decode_1k_color_full_init,  //
+    bench_wuffs_gif_decode_1k_color_part_init,  //
+    bench_wuffs_gif_decode_10k_bgra,            //
+    bench_wuffs_gif_decode_10k_indexed,         //
+    bench_wuffs_gif_decode_20k,                 //
+    bench_wuffs_gif_decode_100k_artificial,     //
+    bench_wuffs_gif_decode_100k_realistic,      //
+    bench_wuffs_gif_decode_1000k_full_init,     //
+    bench_wuffs_gif_decode_1000k_part_init,     //
+    bench_wuffs_gif_decode_anim_screencap,      //
 
 #ifdef WUFFS_MIMIC
 
diff --git a/test/c/std/gzip.c b/test/c/std/gzip.c
index 185884a..830d605 100644
--- a/test/c/std/gzip.c
+++ b/test/c/std/gzip.c
@@ -85,12 +85,12 @@
 
 const char* wuffs_gzip_decode(wuffs_base__io_buffer* dst,
                               wuffs_base__io_buffer* src,
+                              uint32_t wuffs_initialize_flags,
                               uint64_t wlimit,
                               uint64_t rlimit) {
   wuffs_gzip__decoder dec;
   const char* status = wuffs_gzip__decoder__initialize(
-      &dec, sizeof dec, WUFFS_VERSION,
-      WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED);
+      &dec, sizeof dec, WUFFS_VERSION, wuffs_initialize_flags);
   if (status) {
     return status;
   }
@@ -234,13 +234,16 @@
 
 const char* bench_wuffs_gzip_decode_10k() {
   CHECK_FOCUS(__func__);
-  return do_bench_io_buffers(wuffs_gzip_decode, tc_dst, &gzip_midsummer_gt, 0,
-                             0, 300);
+  return do_bench_io_buffers(
+      wuffs_gzip_decode, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED,
+      tc_dst, &gzip_midsummer_gt, 0, 0, 300);
 }
 
 const char* bench_wuffs_gzip_decode_100k() {
   CHECK_FOCUS(__func__);
-  return do_bench_io_buffers(wuffs_gzip_decode, tc_dst, &gzip_pi_gt, 0, 0, 30);
+  return do_bench_io_buffers(
+      wuffs_gzip_decode, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED,
+      tc_dst, &gzip_pi_gt, 0, 0, 30);
 }
 
   // ---------------- Mimic Benches
@@ -249,13 +252,14 @@
 
 const char* bench_mimic_gzip_decode_10k() {
   CHECK_FOCUS(__func__);
-  return do_bench_io_buffers(mimic_gzip_decode, tc_dst, &gzip_midsummer_gt, 0,
-                             0, 300);
+  return do_bench_io_buffers(mimic_gzip_decode, 0, tc_dst, &gzip_midsummer_gt,
+                             0, 0, 300);
 }
 
 const char* bench_mimic_gzip_decode_100k() {
   CHECK_FOCUS(__func__);
-  return do_bench_io_buffers(mimic_gzip_decode, tc_dst, &gzip_pi_gt, 0, 0, 30);
+  return do_bench_io_buffers(mimic_gzip_decode, 0, tc_dst, &gzip_pi_gt, 0, 0,
+                             30);
 }
 
 #endif  // WUFFS_MIMIC
diff --git a/test/c/std/zlib.c b/test/c/std/zlib.c
index 3491373..726d4a4 100644
--- a/test/c/std/zlib.c
+++ b/test/c/std/zlib.c
@@ -85,12 +85,12 @@
 
 const char* wuffs_zlib_decode(wuffs_base__io_buffer* dst,
                               wuffs_base__io_buffer* src,
+                              uint32_t wuffs_initialize_flags,
                               uint64_t wlimit,
                               uint64_t rlimit) {
   wuffs_zlib__decoder dec;
   const char* status = wuffs_zlib__decoder__initialize(
-      &dec, sizeof dec, WUFFS_VERSION,
-      WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED);
+      &dec, sizeof dec, WUFFS_VERSION, wuffs_initialize_flags);
   if (status) {
     return status;
   }
@@ -233,13 +233,16 @@
 
 const char* bench_wuffs_zlib_decode_10k() {
   CHECK_FOCUS(__func__);
-  return do_bench_io_buffers(wuffs_zlib_decode, tc_dst, &zlib_midsummer_gt, 0,
-                             0, 300);
+  return do_bench_io_buffers(
+      wuffs_zlib_decode, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED,
+      tc_dst, &zlib_midsummer_gt, 0, 0, 300);
 }
 
 const char* bench_wuffs_zlib_decode_100k() {
   CHECK_FOCUS(__func__);
-  return do_bench_io_buffers(wuffs_zlib_decode, tc_dst, &zlib_pi_gt, 0, 0, 30);
+  return do_bench_io_buffers(
+      wuffs_zlib_decode, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED,
+      tc_dst, &zlib_pi_gt, 0, 0, 30);
 }
 
   // ---------------- Mimic Benches
@@ -248,13 +251,14 @@
 
 const char* bench_mimic_zlib_decode_10k() {
   CHECK_FOCUS(__func__);
-  return do_bench_io_buffers(mimic_zlib_decode, tc_dst, &zlib_midsummer_gt, 0,
-                             0, 300);
+  return do_bench_io_buffers(mimic_zlib_decode, 0, tc_dst, &zlib_midsummer_gt,
+                             0, 0, 300);
 }
 
 const char* bench_mimic_zlib_decode_100k() {
   CHECK_FOCUS(__func__);
-  return do_bench_io_buffers(mimic_zlib_decode, tc_dst, &zlib_pi_gt, 0, 0, 30);
+  return do_bench_io_buffers(mimic_zlib_decode, 0, tc_dst, &zlib_pi_gt, 0, 0,
+                             30);
 }
 
 #endif  // WUFFS_MIMIC
diff --git a/test/c/testlib/testlib.c b/test/c/testlib/testlib.c
index 3bfc79e..a6b17d3 100644
--- a/test/c/testlib/testlib.c
+++ b/test/c/testlib/testlib.c
@@ -586,8 +586,10 @@
 
 const char* proc_io_buffers(const char* (*codec_func)(wuffs_base__io_buffer*,
                                                       wuffs_base__io_buffer*,
+                                                      uint32_t,
                                                       uint64_t,
                                                       uint64_t),
+                            uint32_t wuffs_initialize_flags,
                             throughput_counter tc,
                             golden_test* gt,
                             uint64_t wlimit,
@@ -638,7 +640,8 @@
   for (i = 0; i < iters; i++) {
     got.meta.wi = 0;
     src.meta.ri = gt->src_offset0;
-    const char* status = codec_func(&got, &src, wlimit, rlimit);
+    const char* status =
+        codec_func(&got, &src, wuffs_initialize_flags, wlimit, rlimit);
     if (status) {
       return status;
     }
@@ -672,25 +675,30 @@
 const char* do_bench_io_buffers(
     const char* (*codec_func)(wuffs_base__io_buffer*,
                               wuffs_base__io_buffer*,
+                              uint32_t,
                               uint64_t,
                               uint64_t),
+    uint32_t wuffs_initialize_flags,
     throughput_counter tc,
     golden_test* gt,
     uint64_t wlimit,
     uint64_t rlimit,
     uint64_t iters_unscaled) {
-  return proc_io_buffers(codec_func, tc, gt, wlimit, rlimit,
-                         iters_unscaled * iterscale, true);
+  return proc_io_buffers(codec_func, wuffs_initialize_flags, tc, gt, wlimit,
+                         rlimit, iters_unscaled * iterscale, true);
 }
 
 const char* do_test_io_buffers(const char* (*codec_func)(wuffs_base__io_buffer*,
                                                          wuffs_base__io_buffer*,
+                                                         uint32_t,
                                                          uint64_t,
                                                          uint64_t),
                                golden_test* gt,
                                uint64_t wlimit,
                                uint64_t rlimit) {
-  return proc_io_buffers(codec_func, tc_neither, gt, wlimit, rlimit, 1, false);
+  return proc_io_buffers(codec_func,
+                         WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED,
+                         tc_neither, gt, wlimit, rlimit, 1, false);
 }
 
 #endif  // WUFFS_INCLUDE_GUARD