Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

x/net/idna: adds 680KiB to binary when imported but unreferenced #38311

Open
bradfitz opened this issue Apr 8, 2020 · 2 comments
Open

x/net/idna: adds 680KiB to binary when imported but unreferenced #38311

bradfitz opened this issue Apr 8, 2020 · 2 comments

Comments

@bradfitz
Copy link
Contributor

@bradfitz bradfitz commented Apr 8, 2020

I'm working on a Go program in a severely constrained environment and found that I can save 680 KiB of disk (and disk == RAM in this environment) by making sure x/net/idna is never imported (even if unused).

That is, the init tasks for x/net/idna and its deps don't layout in memory such that the linker can discard enough:

package main

import (
        _ "golang.org/x/net/idna"
)

func main() {
        println("hi")
}

It adds 680KiB to binary compared to just the println("hi") line without the import.

Linker says:

dev:underidna $ go build --ldflags=-dumpdep 2>&1 | grep idna
# _/home/bradfitz/tailscale/size-reduce/testidna/underidna
main..inittask -> golang.org/x/net/idna..inittask
golang.org/x/net/idna..inittask -> fmt..inittask
golang.org/x/net/idna..inittask -> strings..inittask
golang.org/x/net/idna..inittask -> golang.org/x/text/secure/bidirule..inittask
golang.org/x/net/idna..inittask -> golang.org/x/text/unicode/bidi..inittask
golang.org/x/net/idna..inittask -> golang.org/x/text/unicode/norm..inittask
golang.org/x/net/idna..inittask -> math..inittask
golang.org/x/net/idna..inittask -> golang.org/x/net/idna.init
golang.org/x/net/idna.init -> golang.org/x/net/idna.idnaSparse
golang.org/x/net/idna.init -> golang.org/x/net/idna.idnaSparseValues
golang.org/x/net/idna.init -> golang.org/x/net/idna.idnaSparseOffset
golang.org/x/net/idna.idnaSparseOffset -> golang.org/x/net/idna..stmp_8
golang.org/x/net/idna.idnaSparseValues -> type.[1997]golang.org/x/net/idna.valueRange
golang.org/x/net/idna.idnaSparse -> type.golang.org/x/net/idna.sparseBlocks
golang.org/x/net/idna..stmp_8 -> type.[276]uint16
type.golang.org/x/net/idna.sparseBlocks -> type..namedata.*idna.sparseBlocks-
type.golang.org/x/net/idna.sparseBlocks -> type.*golang.org/x/net/idna.sparseBlocks
type.golang.org/x/net/idna.sparseBlocks -> type..importpath.golang.org/x/net/idna.
type.golang.org/x/net/idna.sparseBlocks -> type..namedata.values-
type.golang.org/x/net/idna.sparseBlocks -> type.[]golang.org/x/net/idna.valueRange
type.*golang.org/x/net/idna.sparseBlocks -> type..namedata.lookup-
type.[]golang.org/x/net/idna.valueRange -> type..namedata.*[]idna.valueRange-
type.[]golang.org/x/net/idna.valueRange -> type.golang.org/x/net/idna.valueRange
type.golang.org/x/net/idna.valueRange -> type..namedata.*idna.valueRange-
type.golang.org/x/net/idna.valueRange -> type.*golang.org/x/net/idna.valueRange
type.[1997]golang.org/x/net/idna.valueRange -> type..eqfunc7988
type.[1997]golang.org/x/net/idna.valueRange -> type..namedata.*[1997]idna.valueRange-

/cc @randall77 @mpvl @rsc @ianlancetaylor

@bradfitz bradfitz added this to the Backlog milestone Apr 8, 2020
@andybons andybons modified the milestones: Backlog, Unplanned Apr 10, 2020
@rasky
Copy link
Member

@rasky rasky commented Apr 11, 2020

Related: #19533 #14840

bradfitz added a commit to tailscale/go that referenced this issue Apr 14, 2020
…unneeded

Updates golang#38311

Saves 640 KiB with the version in the Go 1.14 release branch:

dev:src $ ls -l idna.with*
-rwxr-xr-x 1 bradfitz bradfitz 1925839 Apr 14 08:31 idna.with
-rwxr-xr-x 1 bradfitz bradfitz 1269240 Apr 14 08:31 idna.without

dev:src $ gosize idna.with
1208154 (79.02%) runtime
148673 ( 9.72%) type
62866 ( 4.11%) reflect
22329 ( 1.46%) unicode
18606 ( 1.22%) golang.org/x/text/unicode/bidi
12578 ( 0.82%) sync
 8871 ( 0.58%) internal/reflectlite
 8123 ( 0.53%) golang.org/x/net/idna
 7446 ( 0.49%) syscall
 6337 ( 0.41%) golang.org/x/text/unicode/norm
 6312 ( 0.41%) internal/poll
 4771 ( 0.31%) os
 3415 ( 0.22%) internal/cpu
 1878 ( 0.12%) strconv
 1407 ( 0.09%) time
 1065 ( 0.07%) io
  881 ( 0.06%) fmt
  764 ( 0.05%) runtime/internal/sys
  650 ( 0.04%) sync/atomic
  497 ( 0.03%) runtime/debug
  475 ( 0.03%) golang.org/x/text/transform
  461 ( 0.03%) internal/oserror
  367 ( 0.02%) log
  349 ( 0.02%) unicode/utf8
  329 ( 0.02%) bytes
  307 ( 0.02%) errors
  277 ( 0.02%) golang.org/x/text/secure/bidirule
  185 ( 0.01%) internal/syscall/unix
  174 ( 0.01%) encoding/binary
  163 ( 0.01%) main
   77 ( 0.01%) internal/bytealg
   59 ( 0.00%) runtime/internal/atomic
   46 ( 0.00%) strings
   40 ( 0.00%) math
   14 ( 0.00%) internal/fmtsort
   11 ( 0.00%) sort
   11 ( 0.00%) internal/syscall/execenv

dev:src $ gosize idna.without
886959 (88.54%) runtime
101185 (10.10%) type
 8301 ( 0.83%) internal/reflectlite
 3391 ( 0.34%) internal/cpu
  496 ( 0.05%) runtime/debug
  476 ( 0.05%) runtime/internal/sys
  309 ( 0.03%) errors
  204 ( 0.02%) sync
  161 ( 0.02%) main
  145 ( 0.01%) golang.org/x/net/idna
   97 ( 0.01%) time
   77 ( 0.01%) internal/bytealg
@bradfitz
Copy link
Contributor Author

@bradfitz bradfitz commented Apr 18, 2020

Also related: #38450 (lazy imports proposal)

bradfitz added a commit to tailscale/go that referenced this issue Jun 14, 2020
…unneeded

Updates golang#38311

Saves 640 KiB with the version in the Go 1.14 release branch:

dev:src $ ls -l idna.with*
-rwxr-xr-x 1 bradfitz bradfitz 1925839 Apr 14 08:31 idna.with
-rwxr-xr-x 1 bradfitz bradfitz 1269240 Apr 14 08:31 idna.without

dev:src $ gosize idna.with
1208154 (79.02%) runtime
148673 ( 9.72%) type
62866 ( 4.11%) reflect
22329 ( 1.46%) unicode
18606 ( 1.22%) golang.org/x/text/unicode/bidi
12578 ( 0.82%) sync
 8871 ( 0.58%) internal/reflectlite
 8123 ( 0.53%) golang.org/x/net/idna
 7446 ( 0.49%) syscall
 6337 ( 0.41%) golang.org/x/text/unicode/norm
 6312 ( 0.41%) internal/poll
 4771 ( 0.31%) os
 3415 ( 0.22%) internal/cpu
 1878 ( 0.12%) strconv
 1407 ( 0.09%) time
 1065 ( 0.07%) io
  881 ( 0.06%) fmt
  764 ( 0.05%) runtime/internal/sys
  650 ( 0.04%) sync/atomic
  497 ( 0.03%) runtime/debug
  475 ( 0.03%) golang.org/x/text/transform
  461 ( 0.03%) internal/oserror
  367 ( 0.02%) log
  349 ( 0.02%) unicode/utf8
  329 ( 0.02%) bytes
  307 ( 0.02%) errors
  277 ( 0.02%) golang.org/x/text/secure/bidirule
  185 ( 0.01%) internal/syscall/unix
  174 ( 0.01%) encoding/binary
  163 ( 0.01%) main
   77 ( 0.01%) internal/bytealg
   59 ( 0.00%) runtime/internal/atomic
   46 ( 0.00%) strings
   40 ( 0.00%) math
   14 ( 0.00%) internal/fmtsort
   11 ( 0.00%) sort
   11 ( 0.00%) internal/syscall/execenv

dev:src $ gosize idna.without
886959 (88.54%) runtime
101185 (10.10%) type
 8301 ( 0.83%) internal/reflectlite
 3391 ( 0.34%) internal/cpu
  496 ( 0.05%) runtime/debug
  476 ( 0.05%) runtime/internal/sys
  309 ( 0.03%) errors
  204 ( 0.02%) sync
  161 ( 0.02%) main
  145 ( 0.01%) golang.org/x/net/idna
   97 ( 0.01%) time
   77 ( 0.01%) internal/bytealg
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Linked pull requests

Successfully merging a pull request may close this issue.

None yet
3 participants
You can’t perform that action at this time.