Re-arrange struct fields so bulk data is last
name old speed new speed delta
wuffs_adler32_10k/clang5 2.42GB/s ± 1% 2.43GB/s ± 1% +0.15% (p=0.014 n=46+45)
wuffs_adler32_100k/clang5 2.43GB/s ± 1% 2.43GB/s ± 1% ~ (p=0.532 n=43+46)
wuffs_adler32_10k/gcc7 3.22GB/s ± 0% 3.23GB/s ± 1% +0.17% (p=0.000 n=47+48)
wuffs_adler32_100k/gcc7 3.23GB/s ± 0% 3.23GB/s ± 0% +0.20% (p=0.000 n=45+48)
wuffs_crc32_ieee_10k/clang5 2.86GB/s ± 0% 2.86GB/s ± 0% +0.22% (p=0.000 n=47+46)
wuffs_crc32_ieee_100k/clang5 2.88GB/s ± 0% 2.88GB/s ± 1% +0.11% (p=0.006 n=48+47)
wuffs_crc32_ieee_10k/gcc7 3.37GB/s ± 1% 3.37GB/s ± 1% ~ (p=0.050 n=49+48)
wuffs_crc32_ieee_100k/gcc7 3.40GB/s ± 0% 3.40GB/s ± 1% +0.15% (p=0.001 n=46+48)
wuffs_deflate_decode_1k/clang5 139MB/s ± 0% 138MB/s ± 0% -0.44% (p=0.000 n=45+47)
wuffs_deflate_decode_10k/clang5 222MB/s ± 0% 233MB/s ± 1% +4.81% (p=0.000 n=45+47)
wuffs_deflate_decode_100k_just_one_read/clang5 260MB/s ± 1% 274MB/s ± 0% +5.34% (p=0.000 n=46+45)
wuffs_deflate_decode_100k_many_big_reads/clang5 218MB/s ± 0% 224MB/s ± 1% +2.36% (p=0.000 n=44+46)
wuffs_deflate_decode_1k/gcc7 158MB/s ± 1% 157MB/s ± 1% -0.23% (p=0.000 n=44+48)
wuffs_deflate_decode_10k/gcc7 266MB/s ± 1% 265MB/s ± 1% -0.48% (p=0.000 n=45+47)
wuffs_deflate_decode_100k_just_one_read/gcc7 323MB/s ± 1% 320MB/s ± 0% -0.87% (p=0.000 n=46+46)
wuffs_deflate_decode_100k_many_big_reads/gcc7 255MB/s ± 0% 252MB/s ± 0% -1.04% (p=0.000 n=42+44)
wuffs_gif_decode_1k_bw/clang5 243MB/s ± 1% 238MB/s ± 1% -1.74% (p=0.000 n=49+48)
wuffs_gif_decode_1k_color/clang5 142MB/s ± 1% 140MB/s ± 1% -1.17% (p=0.000 n=45+49)
wuffs_gif_decode_10k_bgra/clang5 723MB/s ± 1% 720MB/s ± 1% -0.37% (p=0.000 n=48+49)
wuffs_gif_decode_10k_indexed/clang5 193MB/s ± 1% 194MB/s ± 1% +0.23% (p=0.002 n=49+48)
wuffs_gif_decode_20k/clang5 245MB/s ± 1% 246MB/s ± 1% +0.20% (p=0.002 n=49+46)
wuffs_gif_decode_100k_artificial/clang5 542MB/s ± 1% 543MB/s ± 1% +0.16% (p=0.012 n=48+47)
wuffs_gif_decode_100k_realistic/clang5 227MB/s ± 1% 226MB/s ± 1% -0.31% (p=0.000 n=48+45)
wuffs_gif_decode_1000k/clang5 232MB/s ± 0% 231MB/s ± 1% -0.40% (p=0.000 n=48+42)
wuffs_gif_decode_anim_screencap/clang5 1.08GB/s ± 1% 1.07GB/s ± 1% -1.09% (p=0.000 n=46+46)
wuffs_gif_decode_1k_bw/gcc7 264MB/s ± 1% 262MB/s ± 1% -0.81% (p=0.000 n=50+49)
wuffs_gif_decode_1k_color/gcc7 148MB/s ± 0% 146MB/s ± 1% -1.60% (p=0.000 n=47+49)
wuffs_gif_decode_10k_bgra/gcc7 621MB/s ± 1% 618MB/s ± 1% -0.47% (p=0.000 n=49+49)
wuffs_gif_decode_10k_indexed/gcc7 194MB/s ± 1% 194MB/s ± 3% ~ (p=0.222 n=49+50)
wuffs_gif_decode_20k/gcc7 236MB/s ± 1% 237MB/s ± 1% +0.52% (p=0.000 n=49+45)
wuffs_gif_decode_100k_artificial/gcc7 505MB/s ± 1% 507MB/s ± 1% +0.36% (p=0.000 n=46+47)
wuffs_gif_decode_100k_realistic/gcc7 210MB/s ± 1% 210MB/s ± 1% ~ (p=0.081 n=49+42)
wuffs_gif_decode_1000k/gcc7 213MB/s ± 1% 213MB/s ± 1% -0.19% (p=0.001 n=49+47)
wuffs_gif_decode_anim_screencap/gcc7 1.06GB/s ± 0% 1.05GB/s ± 1% -1.02% (p=0.000 n=48+47)
wuffs_gzip_decode_10k/clang5 206MB/s ± 0% 215MB/s ± 0% +4.52% (p=0.000 n=49+44)
wuffs_gzip_decode_100k/clang5 239MB/s ± 0% 250MB/s ± 0% +4.71% (p=0.000 n=47+46)
wuffs_gzip_decode_10k/gcc7 250MB/s ± 1% 249MB/s ± 0% -0.38% (p=0.000 n=47+50)
wuffs_gzip_decode_100k/gcc7 293MB/s ± 0% 289MB/s ± 0% -1.28% (p=0.000 n=45+44)
wuffs_lzw_decode_20k/clang5 265MB/s ± 1% 265MB/s ± 0% ~ (p=0.331 n=47+44)
wuffs_lzw_decode_100k/clang5 452MB/s ± 1% 450MB/s ± 1% -0.31% (p=0.001 n=48+46)
wuffs_lzw_decode_20k/gcc7 264MB/s ± 1% 263MB/s ± 1% -0.49% (p=0.000 n=48+47)
wuffs_lzw_decode_100k/gcc7 481MB/s ± 1% 475MB/s ± 1% -1.22% (p=0.000 n=48+50)
wuffs_zlib_decode_10k/clang5 202MB/s ± 0% 212MB/s ± 0% +5.18% (p=0.000 n=46+46)
wuffs_zlib_decode_100k/clang5 235MB/s ± 0% 247MB/s ± 0% +4.92% (p=0.000 n=46+45)
wuffs_zlib_decode_10k/gcc7 246MB/s ± 0% 246MB/s ± 0% -0.13% (p=0.001 n=45+47)
wuffs_zlib_decode_100k/gcc7 289MB/s ± 0% 291MB/s ± 0% +0.67% (p=0.000 n=47+46)
diff --git a/release/c/wuffs-unsupported-snapshot.c b/release/c/wuffs-unsupported-snapshot.c
index 336744b..b252fda 100644
--- a/release/c/wuffs-unsupported-snapshot.c
+++ b/release/c/wuffs-unsupported-snapshot.c
@@ -2699,12 +2699,12 @@
uint32_t f_bits;
uint32_t f_n_bits;
+ uint32_t f_history_index;
+ bool f_end_of_block;
uint32_t f_huffs[2][1024];
uint32_t f_n_huffs_bits[2];
uint8_t f_history[32768];
- uint32_t f_history_index;
uint8_t f_code_lengths[320];
- bool f_end_of_block;
struct {
uint32_t coro_susp_point;
@@ -3107,11 +3107,11 @@
wuffs_base__range_ie_u32 f_dirty_y;
uint64_t f_compressed_ri;
uint64_t f_compressed_wi;
+ wuffs_base__pixel_swizzler f_swizzler;
+ wuffs_lzw__decoder f_lzw;
uint8_t f_compressed[4096];
uint8_t f_palettes[2][1024];
uint8_t f_dst_palette[1024];
- wuffs_base__pixel_swizzler f_swizzler;
- wuffs_lzw__decoder f_lzw;
struct {
uint32_t coro_susp_point;
@@ -3350,9 +3350,9 @@
uint32_t magic;
uint32_t active_coroutine;
- wuffs_deflate__decoder f_flate;
- wuffs_crc32__ieee_hasher f_checksum;
bool f_ignore_checksum;
+ wuffs_crc32__ieee_hasher f_checksum;
+ wuffs_deflate__decoder f_flate;
struct {
uint32_t coro_susp_point;
@@ -3502,9 +3502,9 @@
uint32_t magic;
uint32_t active_coroutine;
- wuffs_deflate__decoder f_flate;
- wuffs_adler32__hasher f_checksum;
bool f_ignore_checksum;
+ wuffs_adler32__hasher f_checksum;
+ wuffs_deflate__decoder f_flate;
struct {
uint32_t coro_susp_point;
@@ -10488,16 +10488,16 @@
return wuffs_base__error__check_wuffs_version_not_applicable;
}
{
- wuffs_base__status z = wuffs_deflate__decoder__check_wuffs_version(
- &self->private_impl.f_flate, sizeof(self->private_impl.f_flate),
+ wuffs_base__status z = wuffs_crc32__ieee_hasher__check_wuffs_version(
+ &self->private_impl.f_checksum, sizeof(self->private_impl.f_checksum),
WUFFS_VERSION);
if (z) {
return z;
}
}
{
- wuffs_base__status z = wuffs_crc32__ieee_hasher__check_wuffs_version(
- &self->private_impl.f_checksum, sizeof(self->private_impl.f_checksum),
+ wuffs_base__status z = wuffs_deflate__decoder__check_wuffs_version(
+ &self->private_impl.f_flate, sizeof(self->private_impl.f_flate),
WUFFS_VERSION);
if (z) {
return z;
@@ -10951,16 +10951,16 @@
return wuffs_base__error__check_wuffs_version_not_applicable;
}
{
- wuffs_base__status z = wuffs_deflate__decoder__check_wuffs_version(
- &self->private_impl.f_flate, sizeof(self->private_impl.f_flate),
+ wuffs_base__status z = wuffs_adler32__hasher__check_wuffs_version(
+ &self->private_impl.f_checksum, sizeof(self->private_impl.f_checksum),
WUFFS_VERSION);
if (z) {
return z;
}
}
{
- wuffs_base__status z = wuffs_adler32__hasher__check_wuffs_version(
- &self->private_impl.f_checksum, sizeof(self->private_impl.f_checksum),
+ wuffs_base__status z = wuffs_deflate__decoder__check_wuffs_version(
+ &self->private_impl.f_flate, sizeof(self->private_impl.f_flate),
WUFFS_VERSION);
if (z) {
return z;
diff --git a/std/deflate/decode_deflate.wuffs b/std/deflate/decode_deflate.wuffs
index 06a857e..389561b 100644
--- a/std/deflate/decode_deflate.wuffs
+++ b/std/deflate/decode_deflate.wuffs
@@ -64,6 +64,14 @@
bits base.u32,
n_bits base.u32,
+ // history_index indexes the history array, defined below.
+ history_index base.u32,
+
+ // end_of_block is whether decode_huffman_xxx saw an end-of-block code.
+ //
+ // TODO: can decode_huffman_xxx signal this in band instead of out of band?
+ end_of_block base.bool,
+
// huffs and n_huffs_bits are the lookup tables for Huffman decodings.
//
// There are up to 2 Huffman decoders active at any one time. As per this
@@ -108,8 +116,7 @@
//
// history[history_index & 0x7FFF] is where the next byte of decoded output
// will be written.
- history array[0x8000] base.u8, // 32 KiB.
- history_index base.u32,
+ history array[0x8000] base.u8, // 32 KiB.
// code_lengths is used to pass out-of-band data to init_huff.
//
@@ -117,11 +124,6 @@
// code.
code_lengths array[320] base.u8[..15],
- // end_of_block is whether decode_huffman_xxx saw an end-of-block code.
- //
- // TODO: can decode_huffman_xxx signal this in band instead of out of band?
- end_of_block base.bool,
-
util base.utility,
)
diff --git a/std/gif/decode_gif.wuffs b/std/gif/decode_gif.wuffs
index 4d4c305..469e37f 100644
--- a/std/gif/decode_gif.wuffs
+++ b/std/gif/decode_gif.wuffs
@@ -110,18 +110,20 @@
dst_y base.u32,
dirty_y base.range_ie_u32,
+ // Indexes into the compressed array, defined below.
compressed_ri base.u64,
compressed_wi base.u64,
- compressed array[4096] base.u8,
+
+ swizzler base.pixel_swizzler,
+ util base.utility,
+ lzw lzw.decoder,
+
+ compressed array[4096] base.u8,
// palettes[0] and palettes[1] are the Global and Local Color Table.
palettes array[2] array[4 * 256] base.u8,
// dst_palette is the swizzled color table.
dst_palette array[4 * 256] base.u8,
-
- swizzler base.pixel_swizzler,
- util base.utility,
- lzw lzw.decoder,
)
pub func decoder.decode_image_config?(dst nptr base.image_config, src base.io_reader) {
diff --git a/std/gzip/decode_gzip.wuffs b/std/gzip/decode_gzip.wuffs
index 9bad0a4..89b7ed1 100644
--- a/std/gzip/decode_gzip.wuffs
+++ b/std/gzip/decode_gzip.wuffs
@@ -24,10 +24,12 @@
pub const decoder_workbuf_len_max_incl_worst_case base.u64 = 32768 + 512
pub struct decoder?(
- flate deflate.decoder,
- checksum crc32.ieee_hasher,
ignore_checksum base.bool,
- util base.utility,
+ checksum crc32.ieee_hasher,
+
+ flate deflate.decoder,
+
+ util base.utility,
)
pub func decoder.set_ignore_checksum!(ic base.bool) {
diff --git a/std/zlib/decode_zlib.wuffs b/std/zlib/decode_zlib.wuffs
index ad2e345..c7719b7 100644
--- a/std/zlib/decode_zlib.wuffs
+++ b/std/zlib/decode_zlib.wuffs
@@ -26,10 +26,12 @@
pub const decoder_workbuf_len_max_incl_worst_case base.u64 = 32768 + 512
pub struct decoder?(
- flate deflate.decoder,
- checksum adler32.hasher,
ignore_checksum base.bool,
- util base.utility,
+ checksum adler32.hasher,
+
+ flate deflate.decoder,
+
+ util base.utility,
)
pub func decoder.set_ignore_checksum!(ic base.bool) {