![](/img/trans.png)
[英]Why the encoding of text is different when using io.Copy in go language?
[英]io.Copy is a lot slower than calling the mv command
看来io.Copy对我来说很慢:
_,err = io.Copy(destf,srcf)
io.Copy需要更长时间,大约2分钟将1GB文件复制到网络共享。 注意到mv.exe在最多约25秒内完成了这项工作 - 所以我开始为我的工作唤起mv。
output, err := exec.Command("mv", src, dest_folder).CombinedOutput()
这种缓慢在我的最终可以重现,任何有关如何演奏的提示将非常感谢!
更新:
感谢您使用io.CopyBuffer()
的建议,但是mv.exe
仍然以唯一的优势成为唯一的胜利者。
细节:
PS C:\temp> .\move_files.exe .\testfile.data "\\somehost\somefolder\bleh13.txt"
2018/07/14 19:04:54 Created C:\Temp\2\deleteME__913153343, copy of .\testfile.data, Size: 1073745920 bytes
2018/07/14 19:05:55 Transfer with io.Copy() took us 60.836702 seconds
2018/07/14 19:06:47 Transfer with io.CopyBuffer() took us 50.729625 seconds
2018/07/14 19:06:59 Transfer with mv command took us 11.470456 seconds
PS C:\temp>
欢迎您自己尝试: https : //play.golang.org/p/2_lR83A4BXe
你比较副本和移动是不同的东西。 移动文件不会假设将所有数据的副本写入新的物理内存目标,只是重写文件系统中的某些标头/描述符。 所以适当的比较基准
io.Copy
vs cp.exe 也许尝试io.CopyBuffer
: io.Copy
使用32 * 1024字节的缓冲区 。
检查更大或更小的缓冲区大小是否有所不同。
继续我的评论建议尝试CopyFile
Win32 API函数,这是一个包装它的工作程序:
package main
import (
"log"
"os"
"syscall"
"unsafe"
)
var (
kernel32 = syscall.MustLoadDLL("kernel32.dll")
copyFileProc = kernel32.MustFindProc("CopyFileW")
)
func CopyFile(src, dst string, overwrite bool) error {
srcW := syscall.StringToUTF16(src)
dstW := syscall.StringToUTF16(dst)
var failIfExists uintptr
if overwrite {
failIfExists = 0
} else {
failIfExists = 1
}
rc, _, err := copyFileProc.Call(
uintptr(unsafe.Pointer(&srcW[0])),
uintptr(unsafe.Pointer(&dstW[0])),
failIfExists)
if rc == 0 {
return &os.PathError{
Op: "CopyFile",
Path: src,
Err: err,
}
}
return nil
}
func main() {
log.SetFlags(0)
if len(os.Args) != 3 {
log.Fatalf("Wrong # args.\nUsage: %s SOURCE DEST\n", os.Args[0])
}
err := CopyFile(os.Args[1], os.Args[2], false)
if err != nil {
log.Fatal("error copying file: ", err)
}
}
请尝试一下,看看它是否比io.Copy*
提高了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.