我正在尝试研究有关Go效率的一些细节,因为我是新手。我要执行的测试之一是查看Go的fmt.Print
比os.Stdout.WriteLine
快还是慢
这是结果。
快速打印速度
[kamori@kamori-pc playground]$ cat print.go
package main
import "fmt"
import "os"
func main(){
os.Stderr.WriteString("Printing Hello World! 1000000000 times")
for i := 0; i < 1000000000; i++{
fmt.Print("Hello World!\n")
}
}
[kamori@kamori-pc playground]$ go build print.go
[kamori@kamori-pc playground]$ time ./print >/dev/null
Printing Hello World! 1000000000 times
real 13m9.127s
user 8m52.461s
sys 4m15.433s
os.Stdout.WriteString
[kamori@kamori-pc playground]$ cat stdoutwrite.go
package main
import "os"
func main(){
os.Stderr.WriteString("StdoutWriting Hello World! 1000000000 times")
for i := 0; i < 1000000000; i++{
os.Stdout.WriteString("Hello World!\n")
}
}
[kamori@kamori-pc playground]$ go build stdoutwrite.go
[kamori@kamori-pc playground]$ time ./stdoutwrite >/dev/null
StdoutWriting Hello World! 1000000000 times
real 11m36.198s
user 7m31.211s
sys 4m0.080s
我知道这不是测试此过程的最佳方法。但这是我选择的那个,很有趣。我仍然很想知道这些区别,但是结果 kinda 对我来说很有意义。 但是,只是为了好玩,我用Python 3做过同样的事情,并且运行得更快
Python 3
[kamori@kamori-pc playground]$ cat print.py
for i in range(1000000000):
print("Hello World!")
[kamori@kamori-pc playground]$ time python3 print.py >/dev/null
real 6m46.542s
user 6m44.450s
sys 0m0.836s
这是版本详细信息
[kamori@kamori-pc playground]$ go version
go version go1.13.4 linux/amd64
[kamori@kamori-pc playground]$ python --version
Python 3.7.4
[kamori@kamori-pc playground]$ uname -a
Linux kamori-pc 4.19.59-rt23-MANJARO #1 SMP PREEMPT RT Sat Jul 20 07:14:03 UTC 2019 x86_64 GNU/Linux
我的问题是,为什么python out不能执行Go??我的期望是,Go作为一种编译语言会更快。当然,没有大量的逻辑需要即时弄清楚,因此Python也许可以采取一些捷径。但是,这些工作量似乎很小,除了启动开销外,IMO两种语言都应该很快返回。
--- 编辑 ---
我看到了有关使用bufio缓冲写入内容的评论。还有圣洁的钼。
[kamori@kamori-pc playground]$ cat bufferio.go
package main
//import "fmt"
import "os"
import "bufio"
func main(){
os.Stderr.WriteString("Printing Hello World! 1000000000 times")
mywrite := bufio.NewWriter(os.Stdout)
for i := 0; i < 1000000000; i++{
mywrite.WriteString("Hello World!\n")
}
}
[kamori@kamori-pc playground]$ go build bufferio.go
[kamori@kamori-pc playground]$ time ./bufferio >/dev/null
Printing Hello World! 1000000000 times
real 0m9.882s
user 0m9.003s
sys 0m0.865s
--- Edit2 - 对于dave的答案,我继续进行操作并设置flush = True,这是结果。这是我希望在最初的比较中看到的。看起来缓冲可以节省一天!
[kamori@kamori-pc playground]$ cat print_with_flush_true.py
for i in range(1000000000):
print("Hello World!", flush=True)
[kamori@kamori-pc playground]$ time python3 print_with_flush_true.py >/dev/null
real 27m38.319s
user 23m15.274s
sys 4m16.869s
答案 0 :(得分:6)
Python3缓冲print
的输出。
https://docs.python.org/3/library/functions.html#print
是否缓冲输出通常由文件确定,但是如果flush关键字参数为true,则将强制刷新流。
您需要这样做:
print("Hello World!", flush=True)
要使测试等效