syscall/js, io/fs: fs.Read将最小512字节从JS复制到Go,

lnlaulya  于 3个月前  发布在  Go
关注(0)|答案(6)|浏览(36)

你正在使用哪个版本的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。

v64noz0r

v64noz0r1#

我非常确定这个小小的改变会带来很大的影响,很高兴去实施它,除非这里已经在场的人更容易做到。
请注意,这特别麻烦,因为fsCall无法返回EOF,因为在mapJSError中没有办法构造它。这意味着一个17字节的文件最终有两个缓冲区副本。一个512字节的副本来复制实际的17字节,另一个495字节的副本(512-17)由于GOOS=js缺乏EOF支持而被Map到EOF。

cc @bradfitz,我认为你过去已经看到了一些关于这个问题的代码(提示:poll.FD.Read)

ffdz8vbo

ffdz8vbo2#

@ianlancetaylor,你能看一下这个吗?

ipakzgxi

ipakzgxi3#

This is js so @neelance

vm0i2vca

vm0i2vca4#

以下是Markdown格式的文本内容:


@codefromthecrypt 我刚刚复现了你的发现。请随意实现一个修复。我非常高兴看到你帮助Go支持WebAssembly。👍
xj3cbfub

xj3cbfub5#

好的,我终于开始做了。

dzhpxtsq

dzhpxtsq6#

https://go.dev/cl/430875提到了这个问题:syscall/js: Makes copies from JS to Go more efficient

相关问题