【发布时间】:2014-09-23 16:26:03
【问题描述】:
作为this question 的后续行动,我正在尝试编写一个 Go 程序,该程序仅在有效的情况下列出文件名,而无需不必要的系统调用。这是我迄今为止所拥有的:
package main
import (
"os"
"fmt"
"log"
)
func main() {
// Open directory and check for errors
f, err := os.Open(".")
if err != nil {
log.Fatal(err)
}
// Get file names
files, err := f.Readdirnames(0)
if err != nil {
log.Fatal(err)
}
// Print files
fmt.Print(files, "\n")
}
但是,当我运行 strace 时,我会看到以下许多内容:
clock_gettime(CLOCK_REALTIME, {1406822401, 824793686}) = 0
这与什么有关?如何让这段代码更有效率?
【问题讨论】:
-
为什么您认为调用
clock_gettime会使您的代码效率低下? -
我正在与我在上一个问题中发布的 C 代码进行
time比较。 Go 可执行文件的速度要慢得多。试图弄清楚如何使它们更具可比性,而这个clock_gettime电话经常发生。 -
无法使用
go version devel +6acc2dd545b2 Thu Jul 31 12:55:40 2014 +0400 linux/amd64在我的系统上重现 -
在 x86_64 上,
clock_gettime通过 vdso,因此它完全发生在用户空间中,基本上没有成本,并且不会出现在 strace 中。在 32 位 x86 上,内核 3.15 及更高版本支持 vdsoclock_gettime,但 glibc 尚不支持它。支持应该在 2.21 中。 musl libc 已经支持它。不知道 Go 运行时是否支持。 -
@R.. 可以确认,问题可在 linux/386 上重现。
标签: linux file go operating-system