练习 1.1
描述:修改 echo 程序,使其能够打印 os.Args[0] ,即被执行命令本身的名字。
代码:
package main
import (
"fmt"
"os"
)
func main() {
//需要go run xx.go +对应参数,才会打印出来
fmt.Println(os.Args[0])
}
运行截图:
练习1.2
描述:修改 echo 程序,使其打印每个参数的索引和值,每个一行。
代码:
package main
import (
"fmt"
"os"
)
func main() {
for i := 1; i < len(os.Args); i++ {
fmt.Println(i, os.Args[i])
}
}
运行截图:
练习1.3
描述: 做实验测量潜在低效的版本和使用了 strings.Join 的版本的运行时间差异。(1.6
节讲解了部分 time 包,11.4节展示了如何写标准测试程序,以得到系统性的性能评测。)
(1)用time包来测试运行时间差异
代码:
package main
import (
"fmt"
"os"
"strings"
"time"
)
func main() {
//方式1
startTime1 := time.Now()
s, sep := "", ""
for _, arg := range os.Args[1:] {
s += sep + arg
sep = " "
}
fmt.Println(s)
fmt.Println("方式1所消耗时间(ns):", time.Since(startTime1).Nanoseconds())
//方式2
startTime2 := time.Now()
fmt.Println(strings.Join(os.Args[1:], " "))
fmt.Println("方式2所消耗时间(ns)", time.Since(startTime2).Nanoseconds())
}
运行截图:
PS:运行了几次,大概是方式一消耗的时间多一点,但是直接测试时间并不精确。
(2)用go test的基准测试
新建了一个xxx_test.go文件,必须跟xxx.go文件在同一目录。
package main
import (
"os"
"testing"
)
// 基准测试 MethodOne
func BenchmarkMethodOne(b *testing.B) {
// 设置测试环境
os.Args = []string{"cmd", "arg1", "arg2", "arg3", "arg4", "arg5"}
// 重置计时器
b.ResetTimer()
for i := 0; i < b.N; i++ {
MethodOne()
}
}
// 基准测试 MethodTwo
func BenchmarkMethodTwo(b *testing.B) {
// 设置测试环境
os.Args = []string{"cmd", "arg1", "arg2", "arg3", "arg4", "arg5"}
// 重置计时器
b.ResetTimer()
for i := 0; i < b.N; i++ {
MethodTwo()
}
}
go test -bench=Method
其中Method是类似于一个正则标准式。
当然我更建议直接通过goland中一些按钮来进行基准测试
运行截图:
对比后,很明显是采用了string.Join会更快一点。