compile time compression for associatve array literal

jfondren julian.fondren at gmail.com
Mon Aug 23 14:49:17 UTC 2021


On Monday, 23 August 2021 at 14:04:05 UTC, Brian Tiffin wrote:
> That's the goal.  It's an optional goal at this point.  I'm not 
> *really* worried about size of object code, yet, but figured 
> this would be a neat way to shrink the compiled code generated 
> from some large COBOL source fragments embedded in D source.

The decompression needs to happen at runtime, where these 
libraries are still useful. The compression could happen through 
CTFE once some suitable compression code is written in D, but 
that's not actually required to get the results of

1. your object file contains compressed strings

2. your program decompresses them at runtime

You can still achieve this end by having your build system 
compress external files that D then includes.

Manually setting this up:

```
$ dd if=/dev/zero bs=$((1024*1024)) count=1024 of=gigabyte.data
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 1.3655 s, 786 MB/s

$ time zip giga.zip gigabyte.data
   adding: gigabyte.data (deflated 100%)

real    0m5.645s
user    0m5.470s
sys     0m0.160s

$ du -sh giga.zip
1020K   giga.zip

$ dmd -J. -O zeroes.d

$ du -sh zeroes
3.3M    zeroes

$ time ./zeroes > out.data

real    0m3.310s
user    0m1.486s
sys     0m1.167s

$ diff -s gigabyte.data out.data
Files gigabyte.data and out.data are identical
```

 From this zeroes.d:

```d
import std.stdio : write;
import std.zip;

enum zeroes = import("giga.zip");

void main() {
     auto zip = new ZipArchive(cast(char[]) zeroes);
     ArchiveMember am = zip.directory.values[0];
     zip.expand(am);
     write(cast(char[]) am.expandedData);
}
```


More information about the Digitalmars-d-learn mailing list