Add flag to skip writing output from soong_zip.

We want to measure how much of build time is spent on writing large
zips to disk. We can do this by doing the rest of the work but
skipping the write itself.

Some local and trivial testing shows this is probably a lot of the
cost of these rules:

    $ python -m timeit -s "import os" -r 10 "os.system('soong_zip -write_if_changed -o foo.zip -D prebuilts/sdk')"
    1 loop, best of 10: 8.37 sec per loop
    $ python -m timeit -s "import os" -r 10 "os.system('soong_zip -o foo.zip -D prebuilts/sdk')"
    1 loop, best of 10: 5.39 sec per loop
    $ python -m timeit -s "import os" -r 10 "os.system('soong_zip -n -o foo.zip -D prebuilts/sdk')"
    1 loop, best of 10: 3.66 sec per loop

Bug: None
Test: treehugger
Change-Id: I43acdb08d0e00efaba9e5d7add972a7ec41646d2
This commit is contained in:
Dan Albert
2023-07-13 17:41:04 +00:00
parent 2c59e46034
commit 1cec6d5000
2 changed files with 7 additions and 2 deletions

View File

@@ -173,6 +173,7 @@ func main() {
cpuProfile := flags.String("cpuprofile", "", "write cpu profile to file")
traceFile := flags.String("trace", "", "write trace to file")
sha256Checksum := flags.Bool("sha256", false, "add a zip header to each file containing its SHA256 digest")
doNotWrite := flags.Bool("n", false, "Nothing is written to disk -- all other work happens")
flags.Var(&rootPrefix{}, "P", "path prefix within the zip at which to place files")
flags.Var(&listFiles{}, "l", "file containing list of files to zip")
@@ -236,6 +237,7 @@ func main() {
StoreSymlinks: *symlinks,
IgnoreMissingFiles: *ignoreMissingFiles,
Sha256Checksum: *sha256Checksum,
DoNotWrite: *doNotWrite,
})
if err != nil {
fmt.Fprintln(os.Stderr, "error:", err.Error())

View File

@@ -282,6 +282,7 @@ type ZipArgs struct {
StoreSymlinks bool
IgnoreMissingFiles bool
Sha256Checksum bool
DoNotWrite bool
Stderr io.Writer
Filesystem pathtools.FileSystem
@@ -400,7 +401,9 @@ func Zip(args ZipArgs) error {
var zipErr error
if !args.WriteIfChanged {
if args.DoNotWrite {
out = io.Discard
} else if !args.WriteIfChanged {
f, err := os.Create(args.OutputFilePath)
if err != nil {
return err
@@ -421,7 +424,7 @@ func Zip(args ZipArgs) error {
return zipErr
}
if args.WriteIfChanged {
if args.WriteIfChanged && !args.DoNotWrite {
err := pathtools.WriteFileIfChanged(args.OutputFilePath, buf.Bytes(), 0666)
if err != nil {
return err