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