【问题标题】:In Go, why does "File.Readdirnames" make a "clock_gettime" system call?在 Go 中,为什么“File.Readdirnames”会进行“clock_gettime”系统调用?
【发布时间】: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 及更高版本支持 vdso clock_gettime,但 glibc 尚不支持它。支持应该在 2.21 中。 musl libc 已经支持它。不知道 Go 运行时是否支持。
  • @R.. 可以确认,问题可在 linux/386 上重现。

标签: linux file go operating-system


【解决方案1】:

我在吐槽,但我认为这与 Go 的内置调度程序和垃圾收集有关。

简短的回答是,go 永远不会像 C 那样快,因为它提供了 C 不提供的所有额外运行时功能。

您列出的代码可能是在 Go 中完成您想做的事情的最快方式。

【讨论】:

    【解决方案2】:

    clock_gettime 只是一个系统调用,在 go 的运行时调用。 runtime做了很多事情,schedual之类的,这么多clock_gettime是正常的。

    我不认为你可以让这个程序更高效,因为它只是为了这么小的功能。你不应该介意。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-10
      • 1970-01-01
      • 2019-06-01
      • 1970-01-01
      相关资源
      最近更新 更多