你正在使用哪个版本的Go( go version
)?
$ go version
go version go1.17.11 darwin/amd64
这个问题在最新版本中是否重现?
是的
你正在使用什么操作系统和处理器架构( go env
)?
GOARCH=wasm GOOS=js
go env
输出
$ go env
GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/Users/adrian/Library/Caches/go-build"
GOENV="/Users/adrian/Library/Application Support/go/env"
GOEXE=""
GOEXPERIMENT=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOINSECURE=""
GOMODCACHE="/Users/adrian/go/pkg/mod"
GONOPROXY=""
GONOSUMDB=""
GOOS="darwin"
GOPATH="/Users/adrian/go"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/Users/adrian/.gimme/versions/go1.17.11.darwin.amd64"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/Users/adrian/.gimme/versions/go1.17.11.darwin.amd64/pkg/tool/darwin_amd64"
GOVCS=""
GOVERSION="go1.17.11"
GCCGO="gccgo"
AR="ar"
CC="clang"
CXX="clang++"
CGO_ENABLED="1"
GOMOD="/Users/adrian/oss/wazero/go.mod"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -arch x86_64 -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/vd/1cf8zdb1721f4z5rjggy8bp40000gn/T/go-build3326543425=/tmp/go-build -gno-record-gcc-switches -fno-common"
你做了什么?
编译了一个最终使用fs.Read和fs.Write的程序。
例如:
bytes, err := ioutil.ReadFile(os.Args[i])
if err != nil {
os.Exit(1)
}
os.Stdout.Write(bytes)
你期望看到什么?
我期望生成的wasm文件大小不超过文件本身的大小。
你看到了什么?
因为内容较小,所以调用了512而不是预期的nRead,而在fs_js.go中,nRead目前被忽略。这是因为上游对小文件的特殊处理导致的512。以下是代码片段:fs.Read
我认为这应该只复制n字节,因为这样更高效。当读取到零字节时,也应该跳过调用js.CopyBytesToGo。
6条答案
按热度按时间v64noz0r1#
我非常确定这个小小的改变会带来很大的影响,很高兴去实施它,除非这里已经在场的人更容易做到。
请注意,这特别麻烦,因为
fsCall
无法返回EOF
,因为在mapJSError
中没有办法构造它。这意味着一个17字节的文件最终有两个缓冲区副本。一个512字节的副本来复制实际的17字节,另一个495字节的副本(512-17)由于GOOS=js缺乏EOF支持而被Map到EOF。cc @bradfitz,我认为你过去已经看到了一些关于这个问题的代码(提示:
poll.FD.Read
)ffdz8vbo2#
@ianlancetaylor,你能看一下这个吗?
ipakzgxi3#
This is js so @neelance
vm0i2vca4#
以下是Markdown格式的文本内容:
xj3cbfub5#
好的,我终于开始做了。
dzhpxtsq6#
https://go.dev/cl/430875提到了这个问题:
syscall/js: Makes copies from JS to Go more efficient