我有一小段代码,名为test.go. 它在执行两次写入时计算时间(ns),将相同的字节片写入 2 个文件,一个带有标志syscall.O_DIRECT,另一个没有。
代码如下:
package main;
import (
"os"
"time"
"fmt"
"strconv"
"bytes"
"syscall"
// "os/exec"
)
func main() {
num, _ := strconv.Atoi(os.Args[1]);
writeContent:= bytes.Repeat( ([]byte)("1"), num );
t1:= time.Now().UnixNano();
fd1, err := syscall.Open("abc.txt", syscall.O_WRONLY | syscall.O_DIRECT | syscall.O_TRUNC, 0);
syscall.Write(fd1, writeContent);
if err != nil {panic(err);}
t2:= time.Now().UnixNano();
fmt.Println("sysW1:", t2-t1);
t1= time.Now().UnixNano();
fd2, err := syscall.Open("abc.txt", syscall.O_WRONLY | syscall.O_TRUNC, 0);
syscall.Write(fd2, writeContent);
if err != nil {panic(err);}
t2= time.Now().UnixNano();
fmt.Println("sysW2:", t2-t1);
}
该程序在 linux 命令行中运行,如下所示:(编译后go build ./test.go)
./test 1024
我原以为写有标志syscall.O_DIRECT的文件会更快,但结果表明写有syscall.O_DIRECT标志的文件比没有它的写慢大约30倍:(
结果:
sysW1: 1107377
sysW2: 37155
为什么?我认为使用 syscall.O_DIRECT 进行编写会减少复制并且会更快,但现在证明它要慢得多。请帮我解释一下:(
PX:我不会提供游乐场链接,因为在游乐场运行程序时由于某些原因总是返回0。
白衣染霜花
相关分类